src中有三个包:模型、视图和控制器。视图有几个JFrame,模型有几个处理程序逻辑的类,控制器有一个类,其中包含视图中JFrame的实例,而模型中只有一个对象,称为"board"。我应该提到的是,在模型中有一个名为Saver的类,它只有一个要加载的静态方法和一个保存这个对象"board"的静态方法。
当我尝试序列化对象"board"(board和模型中的所有类都是可序列化的)时,当我只尝试序列化属于模型的"board"并且board的所有变量都是可串行化的时,我会从视图中的所有类别和控制器类别中的所有内部类别中获得堆栈跟踪NotSerializableException。
以下是从Saver类保存和加载的方法:
public class Saver {
public static void saveBoard(Board board) throws IOException{
FileOutputStream fileOutputStream = new FileOutputStream("gosavefile.gsf");
ObjectOutputStream obout = new ObjectOutputStream(fileOutputStream);
obout.writeObject(board);
fileOutputStream.close();
obout.close();
}
public static Board loadBoard() throws IOException, ClassNotFoundException{
FileInputStream fileInputStream = new FileInputStream("gosavefile.gsf");
ObjectInputStream obin = new ObjectInputStream(fileInputStream);
Board board = (Board) obin.readObject();
fileInputStream.close();
obin.close();
return board;
}
}
这就是我从控制器类调用saveBoard()方法的地方:
public void save(){
try{
Saver.saveBoard(board);
} catch (IOException e) {
new SaveErrorWindow(mainMenuWindow.getLanguageManager());
e.printStackTrace();
}
}
我以前也这样做过一次,另一个程序使用了同样的方案,效果非常好。所以我真的不明白为什么当我只序列化"board"时,它却试图序列化其他所有东西。
如果需要代码的任何其他部分,只需询问即可。
提前谢谢!
这些类实现java.io.Serializable
是不够的。您还必须确保所有字段都是可序列化的(基元或实现Serializable
的类),依此类推。如果任何类有一个未声明为transient
的不可序列化字段,则序列化将失败。堆栈跟踪应该指向导致问题的类。
为了序列化,对象必须:
- 实现
Serializable
- 所有非瞬态和非静态场必须是基元的或可序列化的。数组被认为是可串行化的,但其元素必须是可串行的