serialVersionUID是干啥的?
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性
的。
在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化, 否则就会出现序列化版本不一致的异常。
为什么还要显示指定serialVersionUID的值?
如果不显示指定serialVersionUID, JVM在序列化时会根据属性
自动生成一个serialVersionUID, 然后与属性一起序列化, 再进行持久化或网络传输。在反序列化时, JVM会再根据属性
自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功, 否则报错。
如果显示指定了, JVM在序列化和反序列化时仍然都会生成一个serialVersionUID, 但值为我们显示指定的值
, 这样在反序列化时新旧版本的serialVersionUID就一致了。
serialVersionUID也被static修饰, 为什么serialVersionUID会被序列化?
其实serialVersionUID属性并没有
被序列化, JVM在序列化对象时会自动生成
一个serialVersionUID, 然后将我们显示指定的serialVersionUID属性值赋给
自动生成的serialVersionUID。
在实际开发中, 不显示指定serialVersionUID的情况会导致什么问题?
如果我们的类写完后不再修改, 那当然不会有问题,。
但这在实际开发中是不可能的, 我们的类会不断迭代, 一旦类被不兼容性修改
了,反序列化过程中会做校验,并且如果没有明确定义的话,会根据类名及属性等
自动生成一个serialVersionUID,两个serialVersionUID不同就会报错。所以在实际开发中, 我们都会显示指定一个serialVersionUID, 值是多少无所谓, 只要不变就行。
serialVersionUID什么时候修改?
《阿里巴巴Java开发手册》中有以下规定: |
---|
为什么阿里巴巴要求程序员谨慎修改serialVersionUID 字段的值 |