编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

serialVersionUID的作用

serialVersionUID:字面意思上是序列化版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。

private static final long serialVersionUID = 1L;

实现Serializable接口的类如果类中没有添加serialVersionUID,那么就会出现如下的警告提示:

类中没有添加serialVersionUID出现的警告

根据代码提示可以看出serialVersionUID有两种生成方式:

采用第一种方式生成的serialVersionUID是1L,例如:

private static final long serialVersionUID = 1L;

采用第二种方式生成的serialVersionUID是根据类名,接口名,方法和属性等来生成的,例如:

private static final long serialVersionUID = 3959055215634785113L;

当我们一个实体类中没有显式的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。譬如,当我们编写一个类时,随着时间的推移,我们因为需求改动,需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化。

如果没有显示指定serialVersionUID,会自动生成一个。

只有同一次编译生成的class才会生成相同的serialVersionUID。

但是如果出现需求变动,Bean类发生改变,则会导致反序列化失败。为了不出现这类的问题,所以我们最好还是显式的指定一个serialVersionUID。


未经允许不得转载: 技术文章 » Java编程 » serialVersionUID的作用