1

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

但是,它不会崩溃。

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

还要注意:我们从不更改 serialVersionUid。

我的推理似乎正确吗?

4

3 回答 3

3

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

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

于 2012-05-18T14:35:59.783 回答
1

好吧,如果您serialVersionUID在课堂上使用它,那么您可以自行更改它。

否则,如果有任何更改,java 将依靠反射来引发异常。

于 2012-05-18T14:32:38.280 回答
0

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

于 2012-05-19T11:53:47.503 回答