什么是serialVersionUID?

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 字段的值

猜你喜欢

转载自blog.csdn.net/weixin_37646636/article/details/132129193
今日推荐