当类在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的秘密
因为在许多情况下,默认id不是唯一的。所以我们创建id是为了创造独特的概念。
serialVersionUID的“long”默认值是Java序列化规范定义的默认值,由默认序列化行为计算得出。
因此,如果您添加了默认版本号,只要在结构上没有任何变化,您的类就会(反)序列化得更快,但是您必须注意,如果您更改了类(添加/删除字段),那么您也会更新序列号。
如果你不需要兼容现有的比特流,你可以把1L放在那里,然后在有变化时根据需要增加版本。也就是说,当更改后的类的默认序列化版本与旧类的默认版本不同时。
如果您没有指定serialVersionUID,那么Java会动态生成一个。生成的serialVersionUID就是这个数字。如果您更改了类中的某些内容,而这些内容并没有真正使您的类与以前的序列化版本不兼容,而是更改了散列,那么您需要使用生成的非常大的数字serialVersionUID(或错误消息中的“预期”数字)。否则,如果你自己记录所有东西,0,1,2…是更好的。
推荐文章
- 等待未来的名单
- 如何检查JSON键是否存在?
- 为什么MongoDB Java驱动在条件中使用随机数生成器?
- 即使从未抛出异常,使用try-catch块的代价是否昂贵?
- 什么时候我们应该使用观察者和可观察对象?
- Java中的split()方法对点(.)不起作用。
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- Java生成两个给定值之间的随机数
- 如何有效地从数组列表或字符串数组中删除所有空元素?
- 比较JUnit断言中的数组,简洁的内置方式?
- codestyle;把javadoc放在注释之前还是之后?
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件