Java 如果我在超类中有默认的SerialVersionId,子类是否继承SerialVersionId

Java 如果我在超类中有默认的SerialVersionId,子类是否继承SerialVersionId,java,serialization,Java,Serialization,如果在超类中有默认的serialVersionId,子类是否继承了serialVersionId?与超类可序列化时类似,子类也可序列化 我最初有一个没有默认值的超类serialVersionUID,因此我得到: local class incompatible: stream classdesc serialVersionUID = -3473908186986930430, local class serialVersionUID = -7527159820765531130 所以我把这个

如果在超类中有默认的
serialVersionId
,子类是否继承了
serialVersionId
?与超类可序列化时类似,子类也可序列化

我最初有一个没有默认值的超类
serialVersionUID
,因此我得到:

local class incompatible: stream classdesc serialVersionUID = -3473908186986930430, 
local class serialVersionUID = -7527159820765531130
所以我把这个添加到超类中:

private static final long serialVersionUID = 1L;
我的问题是:序列化时,序列化是否考虑超类中的“代码> SerialValueUID < /代码>。是否需要在每个子类中明确指定
serialVersionUID

如果我在超类中有默认的SerialVersionId,子类是否继承SerialVersionId

不,它不是继承的,因为它是私有的,并且无论如何,序列化不会认为它属于子类而不使用它。

与超类可序列化时类似,子类也可序列化


这是不相似的
Serializable
是一个接口,它只受语言规则的约束
serialVersionUID
是一个特殊的字段,它有自己的规则,由
ObjectInputStream强制执行。

请在询问之前查看此内容不清楚您要问什么,但Java序列化是需要避免的,就像瘟疫一样。如果您想序列化/反序列化Java对象,请尝试使用协议缓冲区:@MichaelAaronSafyan“像瘟疫一样避免”的作用太强了。J2EE在许多关键点上都依赖它,例如。@EJP,好吧,我承认它可能太强大了。但是,手动序列化非常容易出错,并且很容易破坏向后兼容性。在需要的地方,我仍然建议使用协议缓冲区来生成和解析实际序列化的二进制格式,而不是使用Java的自动序列化。@MichaelAaronSafyan这不是我的经验。根据我的经验,(a)没有人真正阅读过对象序列化规范的版本控制章节,因此他们甚至不知道支持什么版本控制功能,并且(b)有一个神话,即每次更改类时都应该更改
serialVersionUID
,这与实际情况相反。所以他们把FUD变成这样。<代码>序列化不会认为它属于子类而不使用它。你能澄清最后一个比特:<代码>而不使用它< /代码>吗?您的意思是ObjectInputStream将不使用超类的serialVersionUID吗?@Dylanthepiguy“不使用它”的哪一部分您不明白吗?“继承”在这一点上令人困惑
serialVersionUID
private
,因此如何继承它(即在子类中可见)?序列化很可能是向上遍历类树,通过反射找到最接近的类,该类具有
serialVersionUID
(因此可以克服Java语言中的可见性和继承原则)。从您的回答中不清楚,如果实现了
Serializable
的类的子类没有
private[…]serialVersionUID
,会发生什么:序列化失败还是从超类获取uid?@KarlRichter非常好,我忽略了这一点。