其实,序列化版本号起着关键作用,它决定了能否成功反序列化!简单地说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传入的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会抛出序列化版本不一致异常。
当一个实体类中没有显式的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本号。这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。
譬如,我们编写完一个类后,编译打包发给依赖方使用。由于需求变化等原因,我们在本地类中新增了几个字段,此时将新版的类对象,传输给依赖方,依赖方反序列化时便会出现serialVersionUID不一致,导致反序列化失败。
那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,并保持其不变,便可以进行序列化和反序列化。
public class Person implements Serializable { private static final long serialVersionUID = -5809782578272943999L; }