java - 如果我序列化一个类对象,然后修改一个字段并将该字段移至父类,会发生什么情况?

标签 java serialization deserialization

我有一个对象类并保留了它。现在我想创建该现有类的父类(super class),并将一个字段移至父类。

当我反序列化对象时,它将该字段值设置为 null。

Class A{
int a;
String b;
}

我保留了这个类对象。

我创建了新类(class)。

Class B{
String b;
}

我将 B 类扩展到 A 类。

class A extends B{
int a;
}

现在,当我想要反序列化现有的存储对象时,它会将 b 字段值设置为 null;

最佳答案

如果在存在旧版本的序列化实例时对类进行重大更改,则可能会发生各种不好的事情。

在这种情况下,您在表示级别进行了不兼容的更改,但(实际上)告诉序列化系统新旧表示是兼容的......因为您在旧和新表示中使用相同的serialVersionUID值该类的新版本。

我还猜测,虽然类 A (子类)实现了 Serialized,但类 B (父类(super class))却没有。当可序列化类具有不可序列化父类(super class)时,父类(super class)的字段不会被序列化。当类被反序列化时,将调用不可序列化的父类(super class)无参数构造函数。在您的示例中,B 构造函数必须将字段 b 初始化(或默认初始化)为 null

通过序列化获得正确的版本控制是很棘手的。如果您正在考虑对可序列化的类进行更改并且希望能够使用以前序列化的对象,那么您应该阅读 Chapter 5仔细阅读对象序列化规范。事实上,您可能应该阅读整个规范。

一般来说,如果您有可能需要改进可序列化类,那么 Java 对象序列化并不是一个好的选择。基于文本的序列化方案(如 JSON 或 XML)更强大且更“宽容”。或者,数据库可能是更好的选择。

关于java - 如果我序列化一个类对象,然后修改一个字段并将该字段移至父类,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35884470/

相关文章:

java - java 上的 json(包含很少的对象)到 TreeMap

java - 如何从 Json 对象更新 Java (Ebean) 对象

java - Hibernate 不接受 ManyToOne 作为 Id

java - 元类构造函数重写不适用于 @CompileStatic 带注释的类内部的方法

java - 使用多个按钮创建弹出选项框

Java String getBytes 非确定性

GWT RPC 序列化

java - Android 日历 View 更改文本颜色

java - GWT 自定义字段序列化问题

java - 从 Map<String, String> 转换为 POJO