如何序列化 classes,然后使用 Java 中相同 class 的修改版本阅读它们

How to Serialize classes, then read them with a modified version of that same class in Java

我正在开发一个 Minecraft 插件,它使用我制作的名为 customPlayer 的 class。当我从 运行 实例保存插件数据时,我将所有这些对象放入 HashMap 并使用 ObjectOutputStream 保存它们。将这些 class 加载回相同版本的插件效果很好,但是当我修改 class 并尝试使用修改后的 class 读取对象(通常与我的插件的新版本)。

我想了想,想出了一个聪明的办法。我的想法是将旧的 class 文件作为外部库包含在新版本的插件中,祈祷它能奏效。没有。

有更好的方法吗?我是序列化和这类东西的新手,所以任何建议都将不胜感激。下面我将包括一些 customPlayer class 的屏幕截图和服务器的崩溃日志。理想情况下,所提供的任何解决方案都应该能够在将来对 class 进行修改时轻松使用(通过 Github 存储库下载 Jar 的更新)。

Instance Variables and Constructor of customPlayer.java

Is there a better way to do this?

当然有。停止使用序列化和 ObjectOutputStream。这些 类 是一场灾难(甚至 OpenJDK 核心团队也有效地同意这一评估)。它们生成的输出不是特别有效(它比需要的字节多),它不是人类可读的,也不是(容易)被除了 java 代码之外的任何东西读取的,并且它会导致像你这样的毛茸茸的情况 运行 进入.

而是使用例如Jackson 将您的对象变成 JSON,或使用 google 的 protobuf 将其变成高效的二进制 blob。

您可以阅读此 JSON 或这些二进制 blob,使用您想要的任何语言,并且您可以随意选择图书馆的垃圾。您需要为 'save' 对象(将其转换为 JSON / protobuf)和 'read' 对象编写一些显式代码,但现在您可以自由更改代码。

如果坚持继续连载,需要添加一个名为serialVersionUID的字段,并设置readObjectwriteObject。这是复杂的火箭科学,很难搞定。详情在 javadoc of java.io.Serializable.

帮自己一个忙。 不要这样做