我在Java中对象的序列化和反序列化存在问题,我认为这是因为我并不真正理解它是如何工作的 . 我的程序包含Excel中的一些电子表格,但是通过控制台 . 我有一个 class “书”和一个 class “页面” . 在Book中,我声明了一个Page的HashMap,而在Page I中有一个String的Hashmap(用于模拟单元格) . 现在我想要那本书是持久的,为此我要做的是序列化“libro”对象(Book实例):

try {
    FileOutputStream fileOut =
    new FileOutputStream("H:\\Users\\thero\\Desktop\\bin\\libro.bin");
    ObjectOutputStream out = new ObjectOutputStream(fileOut);
    out.writeObject(libro);
    out.close();
    fileOut.close();
    System.out.printf("Se ha guardado el libro correctamente");
} 
catch (IOException i) {
    i.printStackTrace();
}

这段代码包含在一个名为“Salvar”的类的方法中,我从main调用它 . 与此同时,我有一个类“Cargar”与相反的方法:

try {
     FileInputStream fileIn = new FileInputStream("H:\\Users\\thero\\Desktop\\bin\\libro.bin");
     ObjectInputStream in = new ObjectInputStream(fileIn);
     libro = (Book) in.readObject();
     in.close();
     fileIn.close();
  } catch (IOException i) {
     i.printStackTrace();

  } catch (ClassNotFoundException ex) {
        Logger.getLogger(Cargar.class.getName()).log(Level.SEVERE, null, ex);
    }

我也从main调用这个方法,并且在执行它时,没有异常跳转 . 但是,它似乎只加载Book实例,但它不加载Hashmap属性,因此它不会加载创建的带有单元格的电子表格 . 问题出在哪儿?这是我的 class 代码:

package javacalc.items;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class Book implements Serializable{
    private HashMap<String, Page> libro;
    private Page activePage;
    private String nameActivePage;

    public Book(){
        this.libro = new HashMap<>();
    }
    public List <String> getListPages() {
        ArrayList <String> myList = new ArrayList<>();
        for (String s: this.libro.keySet())
            myList.add(s);
        return myList;
    }

    public void setListPages(String s, Page p) {
        this.libro.put(s,p);
    }

    public void deletePage(String s){
        this.libro.remove(s);
    }

    public Page getActivePage() {
        return activePage;
    } 

    public boolean setActivePage(String activePage) {
        Page p = this.libro.get(activePage);
        this.nameActivePage = activePage;
        this.activePage = p;
        return true;
    }

    public String getNameActivePage(){
        return nameActivePage;
    }

    public boolean containsPage(String s){
        return libro.containsKey(s);
    }

    public HashMap<String, Page> getLibro() {
        return this.libro;
    }

}

谢谢 .


哦,我认为我解决了正确,我只是在“Cargar”中做了一些修改:

try {
         String ruta = comando.substring(8, comando.length()-1).trim();
         FileInputStream fileIn = new FileInputStream(ruta);
         ObjectInputStream in = new ObjectInputStream(fileIn);
         Book libro_c = (Book) in.readObject();
         libro.setLibro(libro_c.getLibro());
         in.close();
         fileIn.close();

现在它有效!谢谢你的帮助!!