2011-10-12 54 views
6

当我创建Java类在Eclipse中,它实现Serializable接口,我得到一个警告如何的serialVersionUID计算

的序列化的类ABCD没有声明long类型的静态最终 的serialVersionUID领域

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

添加生成的序列版本号

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

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

回答

12

它根据您的课程结构 - 字段,方法等进行计算。它的确切格式在Object Serialization Specification-see this section中指定。

该规范描述了未提供值时发生的情况,但自动生成使用相同的算法。

流中的物品的顺序如下:

  • 的类名。
  • 类修饰符写成32位整数。
  • 按名称排序的每个接口的名称。
  • 对于按字段名称排序的类的每个字段(私有静态和私有瞬态字段除外:*字段的名称。* 字段的修饰符写为32位整数。*描述符 。字段
  • 如果一个类初始化器存在,写出来的以下:*的方法的名称,*的方法, java.lang.reflect.Modifier.STATIC,写为32位整数的改性剂。 *方法的描述符 ()V。
  • 对于按方法名称和签名排序的每个非私有构造函数:*方法的名称,。*方法的修饰符,编写为32位整数。 *方法的描述符。
  • 对于按方法名称和签名排序的每个非私有方法:*方法的名称。 *该方法的修饰符被写为 的32位整数。 *方法的描述符。
4

自动生成serialVersionIds是基于该方法的签名,参数等类中的类的散列。这样做是为了让serialVersionId在您更改类时发生更改,这表明序列化机制中数据/类不再兼容。这是默认设置。

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