jav*_*erd 17 java serialization
我有一个序列化的类.现在我需要使用setter和getter方法在类中添加一个新变量.此类在RMI中通过线路发送.
在不更改UID的情况下,我可以为它添加新参数和getter以及setter方法吗?我尝试编写一个通过线路发送的示例类,并没有更改UID,并为其添加了新参数和getter以及setter方法.另一方面,我测试了它,我仍然得到了正确的值.我曾经假设,如果我添加新参数,getter和setter方法,我需要更改UID.我错了吗?
rom*_*afe 37
如果你硬编码一个类的SerialVersionUID(通常是1L),存储一些实例,然后重新定义类,你基本上会得到这种行为(这或多或少是常识):
因此,一般的经验法则是,如果您只是添加字段和方法,并且不更改任何现有内容,并且如果您对这些新字段的默认值没有问题,那么您通常可以.
小智 24
哇,很多不好的信息.
Java序列化非常强大.有一套非常明确的规则来管理具有相同uid和不同数据的对象的向后兼容性.基本思想是,只要不更改现有成员的类型,就可以维护相同的uid而不会出现数据问题.
也就是说,您的代码仍然需要聪明地处理可能缺少数据的类.该对象可能正确反序列化,但某些字段中可能没有数据(例如,如果您向该类添加了一个字段并且正在反序列化该类的旧版本).如果你的代码可以处理这个,那么你可以保留当前的uid.如果没有,那么你应该改变它.
除了预定义的规则之外,还有一些高级使用场景,您甚至可以更改现有字段的类型并仍然设法反序列化数据,但这通常仅在极端情况下才需要.
java序列化在网上有很好的文档,你应该能够在相关的sun/oracle教程/ docs中找到所有这些信息.
仅当您让 Java 为您的类生成默认 UID 时,这才有意义。它使用类的实际成员和方法来生成它,因此一旦更改类结构,它就会失效。如果您为类提供 UID,那么仅当您需要从文件等反序列化类的旧版本时,这才有意义。