为什么 java 反序列化即使在不兼容的对象版本之间也能成功



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

但是,它不会崩溃。

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

另外需要注意的是:我们从不更改 serialVersionUid。

我的推理看起来正确吗?

仅当您不提供 serialVersionUID 时,序列化才会使用类签名来生成版本控制,因为您提供的是一个,因此不会使用类签名。

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

好吧,

如果你在类中使用serialVersionUID,那么由你来改变它。

否则,Java 将依靠反射在发生任何更改时抛出异常。

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

相关内容

最新更新