我有一个公共类,它实现Serializable,并由其他多个类扩展。只有那些子类曾经被序列化过-从来没有超类。
超类已定义了serialVersionUID。
我不确定是否重要,但是它没有标记为私有,而是仅具有默认保护-您可能会说它是受软件包保护的
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()之外,我不确定自己需要做什么。我也不知道是否需要向所有子类添加serialVerisonUID,或者每个子类是否都需要实现readObject和writeObject,或者假设只需要在超类中实现一次,便可以只实现一次。