
- 定义序列化对象所对应的类时,使用了序列化版本号
- 定义Student类时,添加了序列化版本号常量,其它部分保持不变
首先实施序列化,在磁盘上产生Student.dat文件,在控制台的输出结果如下:
修改Student类文件,删除male属性及其修改相关方法
实施反序列化,产生Student对象,并输出其信息;在控制台的输出结果如下:
这次反序列化顺利的执行了,产生的对象符合修改后的Student类的定义,没有male数据域的信息。反序列化没有产生异常的原因是在Student类中定义了序列化版本号。为什么定义了序列化版本号,反序列化就能成功呢?因为一旦定义了序列化版本号,即使类文件发生了变动,JVM在加载类文件时并不重新计算指纹,而是使用序列化版本号常量作为指纹,而这个指纹恰恰是存储序列化文件时使用的指纹。两个指纹比对相同,因此反序列化成功进行。这就是在类文件中定义序列化版本号常量的意义所在。
最后说明一下如何在Idea开发工具中针对类文件添加序列化版本号常量。首先在Idea的File菜单中,选择Settings,然后进入Editor栏目中的Inspections选项;在其右侧的Java栏目中,点开Serialization issues下拉选项,勾选“Serializable Class without ‘serialVersionUID’”复选框;如下图所示:
设置之后,如果在实现了Serializable接口的类中没有定义序列化版本号,则类文件的名称会出现黄色背景的警告,如下:
使用鼠标点击Student类名,在其左侧出现一个黄色灯泡,点击黄色灯泡出现下拉菜单,点击下拉菜单中的第一项“Add ‘serialVersionUID’field ”:
自动添加序列化版本号如下:
添加过程说明,Idea开发工具默认情况下对于实现了Serializable接口的类并不进行序列化版本号的检查。但是在实际的开发中,考虑到类文件在后续的过程有可能发生变动,还是通过设置Idea的检查配置,提醒开发者自动添加序列化版本号的做法更加明智。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)