【发布时间】:2012-12-07 11:28:52
【问题描述】:
在我编写的一个相当简单的程序中,我正在使用 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)
如果有帮助,我正在使用许多摆动对象,但根据我的研究,我很确定它们都是可序列化的。
感谢您的帮助!
【问题讨论】:
-
你能显示
GameBoard的readObject和writeObject吗? -
@tcb 我没有覆盖它们。我不知道该怎么做。这会帮助我序列化没有被实例变量引用的对象吗? (在 Thilo 的回答中查看我的 cmets)
-
您是否在要反序列化的类上定义了自定义
readObject方法? -
@Perception 不,我不认为我必须这样做,我也不知道该怎么做。我认为序列化整个策划游戏的想法不会奏效,因为据我现在了解,这将需要将我的类中使用的每个对象都存储为实例变量。我的意思是,如果我将布局管理器添加到 JPanel,则不会被序列化:/
-
@yts - 实际上,您不需要自定义
readMethod。但是,如果您有一个,我会要求您将其包含在您的问题中,因为这些可能是错误的来源。下一个问题,在将文件数据写出后多久尝试将其读回?
标签: java serializable objectoutputstream objectinputstream