在客户端-服务器设置中,我修改了服务器发送的对象的类定义,预计会在客户端崩溃(客户端 jar 尚未更新以反射(reflect)这些更改)。
但是它不会崩溃。
注意:客户端使用对象的方式可能会避免崩溃。客户端永远不会强制转换反序列化的对象,也永远不会使用已删除的字段。该对象仅通过 Jython 从 Python 脚本中使用,这可能在使用对象的字段时采用了一些后期绑定(bind)机制(反射?),因此使事情成为可能。这还假定序列化包括类的签名,这是真的(在 ObjectOutputStream 的文档中提到)。
另请注意:我们从不更改 serialVersionUid。
我的推理是否正确?
最佳答案
仅当您不提供 serialVersionUID 时,序列化才会使用类签名来生成版本控制,因为您提供了一个,所以不会使用类签名。
由于它没有改变,它假定两者兼容并执行默认行为
关于java - 为什么即使在不兼容的对象版本之间,java 反/序列化也会成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654516/