背景
我有一个类,它没有覆盖任何序列化特性,也没有serialVersionUID
,但仍被序列化、存储和后续反序列化。这是一个配置对象,当更改配置时,数据实际上是从配置 UI 中读取的,然后对象通常地“从头开始”创建并序列化以进行存储。只有在使用时,对象才会通过反序列化创建。
现在,在这个类中添加了两个字段,这些字段不应该被序列化,但它们却被序列化了... 当这些字段在默认反序列化后保持为null时,会导致一些反序列化问题(NullPointerException),从而破坏类的不变性。解决方法是打开配置 UI 并保存配置,从而保存对象的正确序列化形式。
问题
现在,如果我以以下方式之一修改类来快速修复问题,那么从保存的配置数据中反序列化对象会发生什么情况呢:
- 移除这些字段,然后保存的数据是新版本,并包含这些字段吗?
- 将这些字段更改为transient,并保存的数据是新版本,并包含这些字段吗?
- 将这些字段更改为transient,并保存的数据是旧版本,并没有这些字段吗?
为了更具体,假设添加的字段是:
private final Map<String, String> extraProperties = new HashMap<String, String>();
这个字段要么从这个类中移除,要么更改为 private final transient
字段。
附注:无需告诉我,可能应该添加自定义序列化代码,然后将整个代码重构,将持久数据和临时数据分离到不同的类中...
serialVersionUID
,并将其添加到您的类中。 - Thilo