0

我在 src 中有三个包:模型、视图和控制器。视图有几个 JFrame,模型有几个处理程序逻辑的类,控制器有一个包含视图中 JFrame 实例的类,而模型中只有一个对象,称为“板”。我应该提到,在模型中有一个名为 Saver 的类,它只有一个静态方法来加载和一个静态方法来保存这个对象“板”。

当我尝试序列化对象“板”(板和模型中的所有类都是可序列化的)时,我从视图中的所有类和控制器类中的所有内部类中进入堆栈跟踪 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();
    }
}

我以前做过一次这样的事情,另一个程序使用了相同的确切方案,并且效果很好。所以我真的不明白为什么当我只序列化“板”时它试图序列化其他所有东西。

如果需要代码的任何其他部分,请询问。

先感谢您!

4

2 回答 2

0

为了被序列化,对象必须:

  • 实施Serializable
  • 所有非瞬态和非静态字段必须是原始的或可序列化的。数组被认为是可序列化的,但它的元素必须是可序列化的
于 2014-02-15T00:35:26.927 回答
0

类实现是不够的java.io.Serializable。您还必须保证所有字段也是可序列化的(原语或实现的类Serializable)等等。如果任何类具有未声明为的不可序列化字段,则transient序列化将失败。您的堆栈跟踪应该指出哪个类导致了问题。

于 2014-02-15T00:43:35.953 回答