我在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();
现在它有效!谢谢你的帮助!!