1 概述
在很多实现接口 Serializable 的类中,我们都能看到 private static final long serialVersionUID,他有什么用呢?
如下代码,如果在 A 场景中代码如下
public class UserDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
... ...
}
如下代码,如果在 B 场景中代码如下
public class UserDTO implements Serializable {
private static final long serialVersionUID = 1L;
private String username;
private String password;
private String nickname
... ...
}
B 场景比 A场景多出一个 nickname 字段,这个时候 serialVersionUID 的值是否相同
如果 UseDTO 在不同场景中使用,
1 用途
用来区分不同版本类的版本是否一致
2 生成方式
2.1 默认生成
private static final long serialVersionUID = 1L;
2.2 根据类名等生成
根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。
private static final long serialVersionUID = -1060216618475607933L;
2.3 不提供 serialVersionUID
有的时候没有提供任何 serialVersionUID 的定义,Java序列化机制会根据编译的 class (它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的)自动生成一个 serialVersionUID 作序列化版本比较用,这种情况下,如果 class 文件(类名,方法明等)没有发生变化(增加空格,换行,增加注释,等等),就算再编译多次,serialVersionUID 也不会变化的.
3 何时使用
例如实体类 UserDTO ,如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,那么我们把 UserDTO 的不同修改版本的 serialVersionUID 定义为一个值,列化实体都可以相互进行串行化和反串行化。
3.1 Eslipse 中如何生成
使用Eclipse/Myeclipse IDE时,会出现左侧的黄色叹号提示,点击这个黄色叹号
3.2 IntelliJ IDEA 中如何生成
IntelliJ IDEA 默认不提供自动生成
- 点击
IntelliJ IDEA> Preferences...
(window 中菜单名是Setting
) - 选择
Plugins
- 在搜索框查询 GenerateSerialVersion
- 点击搜索结果中的
No Plugins found Search in repositiories
- 点击搜索结果中的插件
Install
- 在弹出框中搜索查找
Serializable class without serialVersion ....
- 级别选择
warning
点击apply
- 重启 IntelliJ IDEA
- 右键我们创建的实体对象 选择 generater->serialVersionUID 系统就会自动生成 private static final long serialVersionUID
4 问题
假设 UserDTO 这个实体类在不同地方使用,对他们设置的 serialVersionUID 进行测试