serialVersionUID:字面意思上是序列化版本号,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。private static final long serialVersionUID = 1L;
实现Serializable接口的类如果类中没有添加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。