【发布时间】:2012-01-10 06:30:54
【问题描述】:
我有一个实现 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(),我不确定我需要做什么。我也不知道是否需要将 serialVerisonUIDs 添加到所有子类,或者是否需要每个子类实现 readObject 和 writeObject,或者我是否可以只实现一次,假设我需要在超类中实现。
【问题讨论】:
-
如果以后有人遇到问题:只需删除项目中存在的 .obj 文件,然后再次尝试运行该项目。
标签: java serialization deserialization