序列化版本号详解(九耶-钛伦特)

  • 定义序列化对象所对应的类时,使用了序列化版本号
  • 定义Student类时,添加了序列化版本号常量,其它部分保持不变

 

首先实施序列化,在磁盘上产生Student.dat文件,在控制台的输出结果如下:

 

修改Student类文件,删除male属性及其修改相关方法

序列化版本号详解(九耶-钛伦特)_第1张图片

实施反序列化,产生Student对象,并输出其信息;在控制台的输出结果如下:

这次反序列化顺利的执行了,产生的对象符合修改后的Student类的定义,没有male数据域的信息。反序列化没有产生异常的原因是在Student类中定义了序列化版本号。为什么定义了序列化版本号,反序列化就能成功呢?因为一旦定义了序列化版本号,即使类文件发生了变动,JVM在加载类文件时并不重新计算指纹,而是使用序列化版本号常量作为指纹,而这个指纹恰恰是存储序列化文件时使用的指纹。两个指纹比对相同,因此反序列化成功进行。这就是在类文件中定义序列化版本号常量的意义所在。

 

最后说明一下如何在Idea开发工具中针对类文件添加序列化版本号常量。首先在Idea的File菜单中,选择Settings,然后进入Editor栏目中的Inspections选项;在其右侧的Java栏目中,点开Serialization issues下拉选项,勾选“Serializable Class without ‘serialVersionUID’”复选框;如下图所示:

序列化版本号详解(九耶-钛伦特)_第2张图片

设置之后,如果在实现了Serializable接口的类中没有定义序列化版本号,则类文件的名称会出现黄色背景的警告,如下:

序列化版本号详解(九耶-钛伦特)_第3张图片 

 

使用鼠标点击Student类名,在其左侧出现一个黄色灯泡,点击黄色灯泡出现下拉菜单,点击下拉菜单中的第一项“Add ‘serialVersionUID’field ”: 

序列化版本号详解(九耶-钛伦特)_第4张图片

 

自动添加序列化版本号如下:

序列化版本号详解(九耶-钛伦特)_第5张图片

 

添加过程说明,Idea开发工具默认情况下对于实现了Serializable接口的类并不进行序列化版本号的检查。但是在实际的开发中,考虑到类文件在后续的过程有可能发生变动,还是通过设置Idea的检查配置,提醒开发者自动添加序列化版本号的做法更加明智。

你可能感兴趣的:(九耶张毅老师在线教学,java)