Java对象流和Java.io.EOFException
在我编写的一个相当简单的程序中,我使用ObjectOutputStream保存一个对象(一个包含一些其他对象的游戏)。我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会引发NotSerializableException。为什么不呢?它们都在扩展可序列化类,但它们本身不也应该是可序列化的吗 我遇到的另一个可能与此相关的问题是,当我读回该对象时,会得到一个java.io.EOFException 我不明白这两件事为什么会发生。我使用相同的文件名进行读取和写入。为什么它在完成之前就到达了文件的末尾 以下是编写代码:Java对象流和Java.io.EOFException,java,serializable,objectoutputstream,objectinputstream,Java,Serializable,Objectoutputstream,Objectinputstream,在我编写的一个相当简单的程序中,我使用ObjectOutputStream保存一个对象(一个包含一些其他对象的游戏)。我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会引发NotSerializableException。为什么不呢?它们都在扩展可序列化类,但它们本身不也应该是可序列化的吗 我遇到的另一个可能与此相关的问题是,当我读回该对象时,会得到一个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();
}
下面是阅读代码:
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)加载程序上抛出代码>行
以下是堆栈跟踪:
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)
如果有帮助的话,我使用了很多swing对象,但是根据我的研究,我非常确定它们都是可序列化的
谢谢你的帮助
它们都在扩展可序列化类,但它们本身不也应该是可序列化的吗
不,Serializable是Java中的一个普通接口,所以您可以从超类继承它,无需再次声明它。如果扩展可序列化类,则会自动将其视为可序列化。这在Java中可能是一个设计问题
我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会引发NotSerializableException。为什么不呢?它们都在扩展可序列化类,但它们本身不也应该是可序列化的吗
如果基类是可序列化的
,那么派生类也是可序列化的
。这意味着您不需要显式地指定您的类实现了Serializable
。对于IOException,您可以验证文件是否为空吗?是否有4个字节太小?想想看,有两幅图片应该被写下来,每幅都是10kb。。。每次我的程序写入对象时,它都会根据Windows进行“修改”。序列化是否只保存实例变量引用的对象,或者一旦我向JFrame中添加了一些内容,这就是实际发生的情况?4字节对于序列化对象来说太小了。是的,我这么认为。那么为什么它不保存游戏对象(一个包含一堆JPanel、JLabel等的JFrame)?我取消了twp动作侦听器的序列化,只有一个被实例变量引用的侦听器给了我一个notserializableexception。。这是否意味着我必须让实例变量引用我想要序列化的所有内容?谢谢,Thilo向我解释了这一点。(没有讽刺的意思!)我的第二个问题是现在真正困扰我的是什么:(你能展示GameBoard
的readObject
和writeObject
?@tcb我没有覆盖它们。我不知道怎么做。这能帮我序列化没有被实例变量引用的对象吗?(见我对Thilo答案的评论)你有一个自定义的readObject
方法定义在你试图反序列化的类上吗?@Perception没有,我不认为我必须这样做,我也不知道如何去做。我认为序列化整个智囊团游戏的想法行不通,因为从我现在的理解来看,这需要在游戏中使用每一个对象我的类将被存储为实例变量。我的意思是,如果我向JPanel添加布局管理器,它将不会被序列化:/@yts-实际上,您不需要自定义readMethod
。但是如果您有一个,我会要求您将其包含在问题中,因为这可能是错误的来源。下一个问题,多久会发生把文件数据写出来,你试着把它读回吗?