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