【问题标题】:Java: when serializing an object, I get NotSerializableException from classes I'm not trying to serializeJava:序列化对象时,我从不想序列化的类中得到 NotSerializableException
【发布时间】:2014-02-15 00:32:53
【问题描述】:

我在 src 中有三个包:模型、视图和控制器。 视图有几个 JFrame,模型有几个处理程序逻辑的类,控制器有一个包含视图中 JFrame 实例的类,而模型中只有一个对象,称为“板”。 我应该提到,在模型中有一个名为 Saver 的类,它只有一个静态方法来加载和一个静态方法来保存这个对象'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'时它会尝试序列化其他所有内容。

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

提前谢谢你!

【问题讨论】:

  • 向我们展示Board的源代码
  • Board 可能引用了一个不可序列化的类(甚至可能通过其他一些类)。
  • 这个问题确实不完整。阅读minimal reproducible example,下次做得更好。

标签: java serialization notserializableexception


【解决方案1】:

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

【讨论】:

  • 我所有的字段都实现了可序列化。堆栈跟踪指向视图中的一个类,我不想序列化它。
  • 然后你必须检查你的领域的领域。当引用树中的类之一不可序列化时,会发生 NonSerializableException。它可能不是你写的课程。它可能是一个 API 类。如果它不可序列化,则不能持久化它的状态,但可以将引用它的变量标记为瞬态。
  • 我终于找到了导致它的变量。谢谢!
【解决方案2】:

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

  • 实施Serializable
  • 所有非瞬态和非静态字段必须 是原始的或可序列化的。数组被认为是可序列化的,但它的元素必须是可序列化的

【讨论】:

  • 我所有的字段都实现了可序列化。堆栈跟踪指向视图中的一个类,我不想序列化它。
猜你喜欢
  • 2012-05-09
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多