更改类名会影响Java反序列化吗?

问题描述 投票:0回答:3

我正在进行修改和一个单独的应用程序,允许保存特定游戏的重播。

我需要序列化和反序列化的是 2 个 ContO 类数组、Plane 类、Trackers 类数组和 Medium 类数组,这没问题。

为了扩展此功能,我决定在单独的应用程序中重建它,以便它支持所述游戏的 2 个版本。我计划执行此操作的方法是使用名为 Medium、ContO、Plane 和 Trackers 的抽象类,并且扩展这些类的类将被命名为 MediumVersion1 和 MediumVersion2、ContOVersion1 等。

在原始游戏文件中,两个版本的类都被命名为ContO、Plane、Trackers和Medium,我想知道的是:通过更改类的名称来反映将要反序列化的文件的版本,会不会产生影响反序列化过程?

例如,我在原始游戏文件中将该类序列化为 ContO 名称,但将其反序列化为名为 ContOVersion1 的新类名,但包含完全相同的变量。

java serialization deserialization classname
3个回答
5
投票

我刚刚尝试过这个,答案是你不能更改班级名称。当您尝试将从 ObjectInputStream.readObject() 返回的对象转换为具有不同名称的新类时,您最终会遇到 ClassCastException。即使您在两个类上保留相同的serialVersionUID,情况也是如此。


2
投票

你绝对不能这样做。

原始类和包名称与数据一起编码,传入的对象被构造为该类,因此,为了避免类转换异常,您将其转换为的内容必须相同,该类的许多其他方面也必须相同- 但不是全部。有关详细信息,请参阅对象序列化规范的对象版本控制一章。


0
投票

您可以查看我在开源项目中编写的一个辅助类。我实现了一个

LegacyObjectInputStream
,它能够在从流中反序列化类/包时重命名它。您应该能够轻松地将其适应您的用例。

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