JAVA序列化的机制是通过判断实体类的serialVersionUID来验证版本一致性的 。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
当我们定义的实体类如果没有显示的定义一个类型为long的serialVersionUID的时候,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较。只有同一次编译生成的class才会生成相同的serialVersionUID。譬如,当我们编写一个类时,后期需求改动需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。为了解决这一问题,便是在本地类中显式的添加一个serialVersionUID变量,值保持不变,便可以进行序列化和反序列化。
一般来说,定义serialVersionUID的方式有两种,分别为:
采用默认的1L,具体为private static final long serialVersionUID = 1L;
根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例如 private static final long serialVersionUID = XXXL;