Java serialization - java.io.InvalidClassException local class incompatible
我有一个公共类,它实现了Serializable,它由多个其他类扩展。以前只有那些子类被序列化过 - 从来没有超类。
超类定义了一个串行VersionUID。
我不确定它是否重要,但它没有被标记为私有,而只是具有默认保护 - 您可能会说它是受包保护的
static final long serialVersionUID = -7588980448693010399L;
然而,超类或任何子类都实现了readObject或writeObject,并且没有一个子类具有显式定义的serialVersionUID。我认为在超类中定义的一个就足够了。
尽管如此,就回读以前序列化的对象而言,一切都很好,直到一个新的实例变量List/ArrayList以及一个新方法被添加到超类中,并且一些私有实例变量被添加到其子类之一。
现在,当尝试读回以前序列化的对象时,会引发异常。一个类似于这样:
com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
我假设这是因为默认的串行VersionUID,因为我没有在任何子类中声明一个而使用,现在由于超类和一个子类中的更改而已更改。
关于如何摆脱这一困境的建议将不胜感激。我假设我需要实现readObject和writeObject,但除了调用defaultReadObject()和defaultWriteObject()之外,我不完全确定我需要做什么。我也不知道我是否需要向所有子类添加 serialVerisonUIDs,或者 readObject 和 writeObject 是否需要由每个子类实现,或者我是否可以只实现一次,假设我需要在超类中实现它们。