0

在我编写的一个相当简单的程序中,我正在使用 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)

如果有帮助,我正在使用许多摆动对象,但根据我的研究,我很确定它们都是可序列化的。

谢谢您的帮助!

4

2 回答 2

1

我的第一个问题是,当我从我的任何类中删除“implements Serializable”时,不会抛出 NotSerializableException。为什么不?它们都在扩展 Serializable 类,但它们本身不应该也是 Serializable 吗?

如果基类是Serializable,那么派生类也是Serializable。这意味着您不需要明确指定您的类实现Serializable.

于 2012-12-20T01:19:19.943 回答
1

它们都在扩展 Serializable 类,但它们本身不应该也是 Serializable 吗?

不,Serializable 是 Java 中的一个普通接口,所以你从超类继承它,不需要再次声明它。如果您扩展一个可序列化的类,您将自动被视为可序列化的。这可以说是 Java 中的一个设计问题。

于 2012-12-20T01:08:56.167 回答