Java对象流和Java.io.EOFException

Java对象流和Java.io.EOFException,java,serializable,objectoutputstream,objectinputstream,Java,Serializable,Objectoutputstream,Objectinputstream,在我编写的一个相当简单的程序中,我使用ObjectOutputStream保存一个对象(一个包含一些其他对象的游戏)。我的第一个问题是,当我从任何类中删除“implements Serializable”时,不会引发NotSerializableException。为什么不呢?它们都在扩展可序列化类,但它们本身不也应该是可序列化的吗 我遇到的另一个可能与此相关的问题是,当我读回该对象时,会得到一个java.io.EOFException 我不明白这两件事为什么会发生。我使用相同的文件名进行读取和

在我编写的一个相当简单的程序中,我使用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
。但是如果您有一个,我会要求您将其包含在问题中,因为这可能是错误的来源。下一个问题,多久会发生把文件数据写出来,你试着把它读回吗?