当我创建Java类在Eclipse中,它实现Serializable
接口,我得到一个警告如何的serialVersionUID计算
的序列化的类ABCD没有声明long类型的静态最终 的serialVersionUID领域
所以当我点击警告时,我在Eclipse中得到一个选项
添加生成的序列版本号
一旦我选择该选项,Eclipse会自动为我创建一个serialVersionUID
变量。
现在我想知道该数字是以什么为基础生成的。这是一个随机数字吗?我可以提供我自己的随机数吗?
当我创建Java类在Eclipse中,它实现Serializable
接口,我得到一个警告如何的serialVersionUID计算
的序列化的类ABCD没有声明long类型的静态最终 的serialVersionUID领域
所以当我点击警告时,我在Eclipse中得到一个选项
添加生成的序列版本号
一旦我选择该选项,Eclipse会自动为我创建一个serialVersionUID
变量。
现在我想知道该数字是以什么为基础生成的。这是一个随机数字吗?我可以提供我自己的随机数吗?
它根据您的课程结构 - 字段,方法等进行计算。它的确切格式在Object Serialization Specification-see this section中指定。
该规范描述了未提供值时发生的情况,但自动生成使用相同的算法。
流中的物品的顺序如下:
- 的类名。
- 类修饰符写成32位整数。
- 按名称排序的每个接口的名称。
- 对于按字段名称排序的类的每个字段(私有静态和私有瞬态字段除外:*字段的名称。* 字段的修饰符写为32位整数。*描述符 。字段
- 如果一个类初始化器存在,写出来的以下:*的方法的名称,*的方法, java.lang.reflect.Modifier.STATIC,写为32位整数的改性剂。 *方法的描述符 ()V。
- 对于按方法名称和签名排序的每个非私有构造函数:*方法的名称,。*方法的修饰符,编写为32位整数。 *方法的描述符。
- 对于按方法名称和签名排序的每个非私有方法:*方法的名称。 *该方法的修饰符被写为 的32位整数。 *方法的描述符。
自动生成serialVersionIds是基于该方法的签名,参数等类中的类的散列。这样做是为了让serialVersionId在您更改类时发生更改,这表明序列化机制中数据/类不再兼容。这是默认设置。
当你定义你自己的时候,只需从1开始,当类不再与以前的序列化数据兼容时就增加。