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

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

  hot3.png

类序列化和反序列化后,修改类(加字段或方法) 遇到异常:

Exception in thread “main” java.io.InvalidClassException: Person; local class incompatible: stream classdesc serialVersionUID = 8383901821872620925, local class serialVersionUID = -763618247875550322

意思就是说,文件流中的class和classpath中的class,也就是修改过后的class,不兼容了,处于安全机制考虑,程序抛出了错误,并且拒绝载入。那么如果我们真的有需求要在序列化后添加一个字段或者方法呢?应该怎么办?那就是自己去指定serialVersionUID。之前,在我们的例子中,我们是没有指定serialVersionUID的,那么java编译器会自动给这个class进行一个摘要算法,类似于指纹算法,只要这个文件多一个空格,得到的UID就会截然不同的,可以保证在这么多类中,这个编号是唯一的。所以,我们添加了一个字段后,由于没有显指定serialVersionUID,编译器又为我们生成了一个UID,当然和前面保存在文件中的那个不会一样了,于是就出现了2个号码不一致的错误。因此,只要我们自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法可以用,呵呵。但是serialVersionUID我们怎么去生成呢?你可以写1,也可以写2,都无所谓,但是最好还是按照摘要算法,生成一个惟一的指纹数字,eclipse可以自动生成的,jdk也自带了这个工具。一般写法类似于 private static final long serialVersionUID = -763618247875550322L;

转载于:https://my.oschina.net/caiz/blog/699908

你可能感兴趣的文章
iOS静态库的那些坑
查看>>
IOS-APP提交上架流程(新手必看!2016年3月1日最新版)
查看>>
oracle rman 2
查看>>
hyper-v下NIC实验出现的问题
查看>>
shell 显示文件的行数
查看>>
Linux:常规目录操作
查看>>
2016年2月书单
查看>>
redis存储 100 条最新的记录
查看>>
There is no reason to wait
查看>>
tomcat 配置单向加密连接器-01
查看>>
数据库备份恢复 mysqldump, source
查看>>
花生壳与网络地址转换
查看>>
4.信号与传输介质
查看>>
免费资源下载:Simplycons图标集
查看>>
MySQL 性能医生:OrzDBA
查看>>
【设计模式】代理模式
查看>>
linux脚本获取系统信息(选自实验楼实验)
查看>>
俄罗斯游戏软件:C语言应用初步感受
查看>>
PHP5.4+内置webserver,Yii中如何隐藏index.php,让URL rewrite
查看>>
linux开机启动服务设置
查看>>