为什么java de / serialization甚至在不兼容的对象版本之间成功?

时间:2012-05-18 14:29:06

标签: java serialization late-binding

在客户端 - 服务器设置中,我修改了服务器发送的对象的类定义,并且预计会在客户端崩溃(客户端jar尚未更新以反映这些更改)。

然而,它并没有崩溃。

注意:客户端使用对象的方式可能会避免崩溃。客户端从不转换反序列化的Object,也从不使用已删除的字段。该对象仅通过Jython从Python脚本中使用,在使用对象的字段时可能会使用一些后期绑定机制(反射?),从而使事情成为可能。这也假定序列化包括类'签名,这是真的(由ObjectOutputStream文档提到)。

另请注意:我们永远不会更改serialVersionUid。

我的推理似乎正确吗?

3 个答案:

答案 0 :(得分:3)

序列化将使用类签名仅在您不提供serialVersionUID时生成版本控制,因为您提供的一个类签名将不会被使用。

由于它没有改变,因此假设两者兼容并执行默认行为

答案 1 :(得分:1)

如果您在课堂上使用serialVersionUID,那么您需要更改它。

否则,如果有任何更改,java将依赖反射来抛出异常。

答案 2 :(得分:0)

只要serialVersionUID匹配,删除字段不是不兼容的更改。请参阅对象序列规范的对象版本控制章节。