在我编写的一个相当简单的程序中,我使用ObjectOutputStream保存一个对象(包含一些其他对象的游戏)。我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会抛出NotSerializableException。为什么不?它们都扩展了Serializable类,但它们本身也不应该是Serializable吗?
我可能有的另一个问题是,当我重新读取对象时,我得到了一个java.io.EOFException。
我不明白为什么会发生这两件事。我使用相同的文件名进行读写。为什么在文件结束之前它会到达文件的末尾?
这是编写代码:
public void actionPerformed(ActionEvent event)
{
try
{
saver.writeObject(game);
saver.close();
} catch (IOException e)
{
e.printStackTrace();
}
dispose();
}
以下是阅读代码:
File file = new File("savedgame.dat");
if (file.exists())
{
try
{
loader = new ObjectInputStream(new FileInputStream(file));
game = (GameBoard) loader.readObject();
loader.close();
}
catch (EOFException ex)
{
ex.printStackTrace();
}
}
else
{
game = new GameBoard();
}
game = (GameBoard) loader.readObject();
行正在抛出异常。
这是堆栈跟踪:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
如果有帮助,我会使用很多摆动物体,但从我的研究来看,我很确定它们都是可序列化的。
感谢您的帮助!
答案 0 :(得分:1)
它们都扩展了Serializable类,但它们本身也不应该是Serializable吗?
没有。 Serializable是Java中的普通接口,因此您可以从超类继承它,无需再次声明它。如果扩展可序列化类,则自动被视为可序列化。这可以说是Java中的一个设计问题。
答案 1 :(得分:1)
我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会抛出NotSerializableException。为什么不?它们都扩展了Serializable类,但它们本身也不应该是Serializable吗?
如果基类是Serializable
,那么派生类也是Serializable
。这意味着您无需明确指定您的类实现Serializable
。