【问题标题】:NotSerializableException with java.awt.geom.AreaNotSerializableException 与 java.awt.geom.Area
【发布时间】:2019-07-23 03:54:58
【问题描述】:

我正在创建一个游戏,其中“块”的所有位置都存储在变量 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 如何将Area 对象的内容写入文件并读取它?

另外我有几个后续问题:

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

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

【问题讨论】:

  • “人们推荐使用 XML .. 但我 .. 更愿意坚持纯 Java 方法” J2SE 具有对读取和写入 XML 的内置支持。另见How to serialize Java 2D Shape objects as XML?
  • @Andrew Thompson 问题是,我对 XML 一无所知,虽然我通常有心情学习新东西,但这是一个简单的副项目,我不想投资时间太长了
  • “我不想在上面投入太多时间”我可以理解这一点。继续前进..

标签: java awt objectinputstream objectoutputstream


【解决方案1】:

这个例外很容易解释 NotSerializableException: java.awt.geom.Area 。您要序列化的任何对象都必须实现Serializable 接口。 java,awt.geom.Area 没有。该类的任何属性也必须实现 Serializable、是原语或定义为瞬态的。

我建议要么想办法将 Area 读入实现 Serializable 的对象中。当你读回它时,你可以构造一个新的 Area 对象。这大概就是 cmets 中提到的JSON/XML method 正在做的事情。人类可读存储格式的额外好处是您可以在文本编辑器中对其进行编辑。您将无法使用序列化对象的二进制输出来做到这一点。

【讨论】:

  • “我建议要么想办法将 Area 读入实现 Serializable 的对象中” 我知道这一点,并尝试创建一个类 @987654327 @扩展Area并实现Serializable,但无济于事。
  • 关于可读性部分,没有必要,因为block_area几乎是随机生成的,阅读对我没有用
  • 但是,我为你投入的时间+1,这可能是我的错,因为现在懒得学习像 JSOn 这样的新东西 :)
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2015-06-01
  • 2013-05-14
  • 2023-04-03
  • 2014-07-23
相关资源
最近更新 更多