如何计算serialversionuid

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

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

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

添加生成的串行版本ID

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

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

它是根据类的结构 – 字段,方法等计算的。它在对象序列化规范中指定 – 请参阅本节以获取确切的格式。

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

流中的项目序列如下:

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

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

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