java 序列化 兼容_Java序列化-java.io.InvalidClassException本地类不兼容

这个问题在这里已有答案:

java.io.InvalidClassException:本地类不兼容:                                     6个答案

我有一个公共类,该类实现了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,或者我是否可以只在超类中实现一次(假设根本不需要)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值