我有一个公共类,实现了Serializable接口,并被多个其他类继承。 只有这些子类被序列化过 - 从未序列化过超类。
超类已定义了一个serialVersionUID。
我不确定是否重要,但它没有被标记为private,而是默认受保护的 - 可以说它是包级别保护的。
static final long serialVersionUID = -7588980448693010399L;
超类及其子类中均未实现readObject或writeObject方法,而且子类中也没有明确定义的serialVersionUID。我认为在超类中定义一个将足以满足要求。
尽管如此,在超类中添加了一个新的实例变量(List/ArrayList)和一个新的方法,同时在其中一个子类中添加了一些私有实例变量后,读取以前序列化的对象时出现了问题。
现在在尝试读取以前序列化的对象时,会抛出异常。与此类似的异常如下所示:
com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
我猜测这是因为默认的serialVersionUID已经改变了,因为在任何子类中都没有声明一个,这是由于超类和一个子类的更改导致的。
如果有建议如何解决这个问题,将不胜感激。我猜想我需要实现readObject和writeObject,但除了调用defaultReadObject()和defaultWriteObject()之外,我并不确定需要做什么。我也不知道是否需要为所有子类添加serialVerisonUIDs,或者每个子类是否需要实现readObject和writeObject,或者是否可以只在超类中实现它们(如果需要的话)。