java.awt.geom.Area的NotSerializableException

问题描述 投票:2回答:1

我正在创建一个游戏,其中“块”的所有位置都存储在变量block_area中 - 一个类Area的对象。我的游戏已经运行了一个星期了,我已经决定实现一个保存和加载功能,我将block_area保存到文件Drifter,我的代码为:

Area block_area; // Later initialized

void saveArea()
{
    try
    {
        FileOutputStream fos = new FileOutputStream(savefile);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(block_area);
        oos.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

void loadArea()
{
    try
    {
        FileInputStream fis = new FileInputStream(savefile);
        ObjectInputStream ois = new ObjectInputStream(fis);

        block_area  = (Area)ois.readObject();

        ois.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

但是,这是我第一次写一个OBJECT到一个文件,所以我不太了解它。当我尝试将对象保存到文件时,它给了我这个错误:

java.io.NotSerializableException: java.awt.geom.Area
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at Drifter.saveArea(Drifter.java:58)
    at Drifter.keyPressed(Drifter.java:315)
    ...

如果有人能告诉我如何用文件编写和阅读对象,将非常感谢帮助。

TL;DR How do I write the contents of an Area object to a file and read it?

我还有一些后续问题:

  • ObjectInputStream是最好的行动方案吗?我看过一些人们推荐使用XMLJSON的答案,但是我永远无法找到时间来了解它们,并且更愿意坚持使用纯Java方法(没有任何第三方工具)
  • 有没有其他方法可以将对象的信息保存到外部源,而不是文件处理?

编辑 - 我还应该提到我的班级实现Serializable

java awt objectinputstream objectoutputstream
1个回答
2
投票

唯一的例外是非常自我解释的NotSerializableException: java.awt.geom.Area。要序列化的任何对象都必须实现Serializable接口。 java,awt.geom.Area没有。该类的任何属性还必须实现Serializable,原始或定义为瞬态。

我建议找出一种方法将Area读入一个实现Serializable的对象。当您将其读回时,可以构造一个新的Area对象。这可能是评论中提到的JSON/XML method所做的。人类可读存储格式的附加好处是您可以在文本编辑器中编辑它。您将无法使用序列化对象的二进制输出执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.