当类在Eclipse中实现Serializable时,我有两个选项:添加默认的serialVersionUID(1L)或生成的serialVersionUID(3567653491060394677L)。我认为第一个选项更酷,但很多次我看到人们使用第二个选项。是否有理由生成较长的serialVersionUID?
当前回答
因为在许多情况下,默认id不是唯一的。所以我们创建id是为了创造独特的概念。
其他回答
生成一个类的主要原因是使它与已经有持久化副本的类的现有版本兼容。
序列化版本UID的目的是跟踪类的不同版本,以便执行有效的对象序列化。
其思想是生成一个对类的特定版本唯一的ID,然后在向类添加新细节(例如新字段)时更改该ID,这将影响序列化对象的结构。
总是使用相同的ID(例如1L)意味着在将来,如果类定义发生更改,导致序列化对象的结构发生更改,那么在尝试反序列化对象时很可能会出现问题。
如果省略了ID, Java将根据对象的字段实际为您计算ID,但我认为这是一个开销很大的过程,因此手动提供一个将提高性能。
下面是一些讨论类的序列化和版本控制的文章的链接:
JDC技术提示:2000年2月29日(链接在2013年2月中断) 了解Java Serialization API的秘密
如果您没有指定serialVersionUID,那么Java会动态生成一个。生成的serialVersionUID就是这个数字。如果您更改了类中的某些内容,而这些内容并没有真正使您的类与以前的序列化版本不兼容,而是更改了散列,那么您需要使用生成的非常大的数字serialVersionUID(或错误消息中的“预期”数字)。否则,如果你自己记录所有东西,0,1,2…是更好的。
据我所知,这只是为了与以前的版本兼容。只有当您之前忽略了使用serialVersionUID,然后进行了您知道应该是兼容的但导致序列化中断的更改时,这才有用。
有关更多细节,请参阅Java Serialization Spec。
serialVersionUID的“long”默认值是Java序列化规范定义的默认值,由默认序列化行为计算得出。
因此,如果您添加了默认版本号,只要在结构上没有任何变化,您的类就会(反)序列化得更快,但是您必须注意,如果您更改了类(添加/删除字段),那么您也会更新序列号。
如果你不需要兼容现有的比特流,你可以把1L放在那里,然后在有变化时根据需要增加版本。也就是说,当更改后的类的默认序列化版本与旧类的默认版本不同时。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap