如何计算serialversionuid

时间:2011-10-12 09:47:19

标签: java eclipse serialization

当我在Eclipse中创建实现Serializable接口的Java类时,我收到警告

  

可序列化类ABCD不声明静态final   long类型的serialVersionUID字段

所以当我点击警告时,我在Eclipse中得到一个选项

  

添加生成的串行版本ID

一旦我选择了该选项,Eclipse会自动为我创建一个serialVersionUID变量。

现在我想知道这个数字是以什么为基础生成的。它只是一个随机数?我可以提供自己的随机数吗?

2 个答案:

答案 0 :(得分:13)

它是根据您的类的结构 - 字段,方法等计算得出的。它在Object Serialization Specification - see this section中指定了确切的格式。

规范描述了在没有提供任何值的情况下发生的事情,但自动生成使用相同的算法。

  

流中的项目顺序如下:

     
      
  • 班级名称。
  •   
  • 类修饰符写为32位整数。
  •   
  • 按名称排序的每个界面的名称。
  •   
  • 对于按字段名称排序的类的每个字段(私有静态和私有瞬态字段除外:*字段的名称。*   字段的修饰符写为32位整数。 *描述符   领域的。
  •   
  • 如果存在类初始值设定项,请写出以下内容:*方法的名称,。 *方法的修饰语,   java.lang.reflect.Modifier.STATIC,写为32位整数。 *   方法的描述符,()V。
  •   
  • 对于按方法名称和签名排序的每个非私有构造函数:*方法的名称,。 *的修饰语   写为32位整数的方法。 *方法的描述符。
  •   
  • 对于按方法名称和签名排序的每个非私有方法:*方法的名称。 *该方法的修饰语写为   32位整数。 *方法的描述符。
  •   

答案 1 :(得分:4)

自动生成的serialVersionIds是基于类中的方法签名,参数等的哈希。它是这样完成的,这样无论何时更改类,serialVersionId都会改变,向序列化机制指示数据/类不再兼容。这是默认值。

当你定义自己的时候,只需从1开始,当类不再与以前的序列化数据兼容时递增。