博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Serializable的serialVersionUID
阅读量:6802 次
发布时间:2019-06-26

本文共 1148 字,大约阅读时间需要 3 分钟。

  在实现了Serializable接口的class中,需要声明一个long serialVersionUID,用来标明当前class的版本号,但很多人在编程时,总是不原意去声明这个serialVersionUID,又JVM自己来生成。下面来看看serialVersionUID的作用:

1、如果在序列化写 时的版本号和序列化读 时的版本号,不一致,将会有异常:java.io.InvalidClassException:local class incompatible: stream classdesc serialVersionUID = …, local class serialVersionUID = …

2、那如果在class中不声明这个属性呢?那结果可以就会变得比较诡异了: 

1)、在序列化写 的时候,虚拟机A会为它计算出一个serialVersionUID,计算的方法是依据class的信息,再具体我也不清楚了。

2)、在序列化读 的时候,虚拟机B也会为class计算出一个serialVersionUID,然后做比较。

3)、那么如果两个虚拟机是不同类型的虚拟机,那么计算方法可能就不一样了,于是即使相同的classserialVersionUID也可能会不同,不同的class的,理论上来说,也存在serialVersionUID相同的可能性,所以,serialVersionUID尽量由我们自己来指定,而不要由虚拟机来计算。

3、那如果serialVersionUID一致,而class发生了变化呢? 

1)、如果虚拟机A中的AClass有一个属性,而虚拟机B中的AClass,没有这个属性,那么这个属性将被忽略,而不会有异常。

2)、如果虚拟机A中的AClass没有的属性,而在虚拟机B中多出来的属性,那么这个属性将被赋予一个缺省值,而不会有异常。

3)、如果虚拟机A中的AClass有一个属性,在虚拟机B中的AClass也有这个属性,但这个属性的类型变了,比如说int变成了long,抑或其他的变化,将会有异常:java.io.InvalidClassException:incompatible types for field …

经过序列化而产生的异常都是 java.io.InvalidClassException,不会产生java.lang.ClassCastException,两者还是有比较大的区别的,从名字上就可以看得出来。

看完你还会让JVM自己来生成serialVersionUID吗?你还加@SuppressWarnings("serial")吗?在一个单机上或许看不出什么问题,但在分布式计算、或者你需要提供jar供别人使用的时候,这个问题就会暴露。

转载地址:http://odjwl.baihongyu.com/

你可能感兴趣的文章
解决XenDesktop启动后无法加载picagina.dll文件
查看>>
linux进程管理、任务管理
查看>>
VMware出现的问题(网络)
查看>>
大话数据库编程规范
查看>>
我的友情链接
查看>>
自己收集的golang书籍
查看>>
RCP 文件路径问题
查看>>
python中的自定义函数
查看>>
ELK日志分析平台(一)ELK简介、ElasticSearch集群
查看>>
View 4.6连接异常 求助~~~~~!
查看>>
动态内表及动态ALV显示
查看>>
Xtrabackup备份恢复常用命令与压缩测试
查看>>
Xtrabackup备份恢复常用命令与压缩测试
查看>>
linux运维面试题(一)
查看>>
TFS2008安装图解(详细版本)
查看>>
王家林每日大数据语录Spark篇0016(2015.11.6于南宁)
查看>>
android HOME点击事件的获取
查看>>
2.23——2.25find命令(上中下);2.26 文件名后缀
查看>>
华为服务器的中国梦-当梦想照进现实
查看>>
源码编译安装:隐藏nginx的版本信息
查看>>