更改 class 名称会影响 Java 反序列化吗?
Does changing the class name affect Java Deserialization?
我正在修改和一个单独的应用程序,允许为特定游戏保存回放。
我必须序列化和反序列化的是 class ContO 的 2 个数组,class Plane、Trackers 的数组和一个 class Medium,这没问题。
为了扩展这个功能,我决定在单独的应用程序中重建它,以便它支持所述游戏的 2 个版本。我计划这样做的方法是使用名为 Medium、ContO、Plane 和 Trackers 的抽象 classes,扩展这些的 classes 将被命名为 MediumVersion1 和 MediumVersion2、ContOVersion1,等等。
在原始游戏文件中,class 在两个版本中都被命名为 ContO、Plane、Trackers 和 Medium,我想知道的是:通过更改 class 的名称来反映将被反序列化的文件的版本,它会影响反序列化过程吗?
例如,我在原始游戏文件中将 class 序列化为 ContO 的名称,但将其反序列化为名为 ContOVersion1 的新 class 名称,但包含完全相同的变量。
我刚刚试过了,答案是您不能更改 class 名称。当您尝试将从 ObjectInputStream.readObject() 返回的对象转换为具有不同名称的新 class 时,您最终会遇到 ClassCastException。即使您在两个 classes 上保持相同的 serialVersionUID 也是如此。
你绝对不能这样做。
原始的 class 和包名称与数据一起编码,传入对象被构造为 class,因此,为了避免 class 转换异常,什么您将其转换为必须相同,class 的许多其他方面也必须相同 - 但不是全部。有关详细信息,请参阅对象序列化规范的对象版本控制一章。
我正在修改和一个单独的应用程序,允许为特定游戏保存回放。
我必须序列化和反序列化的是 class ContO 的 2 个数组,class Plane、Trackers 的数组和一个 class Medium,这没问题。
为了扩展这个功能,我决定在单独的应用程序中重建它,以便它支持所述游戏的 2 个版本。我计划这样做的方法是使用名为 Medium、ContO、Plane 和 Trackers 的抽象 classes,扩展这些的 classes 将被命名为 MediumVersion1 和 MediumVersion2、ContOVersion1,等等。
在原始游戏文件中,class 在两个版本中都被命名为 ContO、Plane、Trackers 和 Medium,我想知道的是:通过更改 class 的名称来反映将被反序列化的文件的版本,它会影响反序列化过程吗?
例如,我在原始游戏文件中将 class 序列化为 ContO 的名称,但将其反序列化为名为 ContOVersion1 的新 class 名称,但包含完全相同的变量。
我刚刚试过了,答案是您不能更改 class 名称。当您尝试将从 ObjectInputStream.readObject() 返回的对象转换为具有不同名称的新 class 时,您最终会遇到 ClassCastException。即使您在两个 classes 上保持相同的 serialVersionUID 也是如此。
你绝对不能这样做。
原始的 class 和包名称与数据一起编码,传入对象被构造为 class,因此,为了避免 class 转换异常,什么您将其转换为必须相同,class 的许多其他方面也必须相同 - 但不是全部。有关详细信息,请参阅对象序列化规范的对象版本控制一章。