博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定义serialVersionUID的作用与意义整理
阅读量:5837 次
发布时间:2019-06-18

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

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。


实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static final long serialVersionUID = 1L; 

为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.   

在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。 


这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。 


不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。 

当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。


最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。


关于serialVersionUID的解释 


serialVersionUID作用: 

序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。 


你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:

一个是默认的1L,比如:private static final long serialVersionUID = 1L;

一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。 

Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long 

那是Eclipse提供这个提示功能给你吧.

你点它warning的icon两下Eclipse就会自动给定.

如果你不喜欢,可以把它关掉,

windows -> preferences -> compiler -> Error/Warnings

-> Potential Programming problems

将Serializable class without serialVersionUID的warning改成ignore.


其实如果你没有考虑到兼容性问题时,那就把它关掉吧.

其实有这个功能是好的.

只要任何类别实作了Serializable这个介面,

如果没有加入serialVersionUID,Eclipse都会给你warning提示,

这个serialVersionUID为了让该类别Serializable後兼容.


考虑一下,如果今天你的类Serialized存到硬碟里,

可是後来你却更改了类别的field(增加或减少或改名).

当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.


但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize.

这个可以避开不兼容性的问题.


异常状态:

The serializable class XXX does not declare a static final serialVersionUID field of type long

本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/6296515.html,如需转载请自行联系原作者

你可能感兴趣的文章
华为OJ 名字美丽度
查看>>
mysql-This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决
查看>>
基本概念复习
查看>>
通过Roslyn构建自己的C#脚本(更新版)(转)
查看>>
红黑树
查看>>
【数据库】
查看>>
WindowManager.LayoutParams 详解
查看>>
Linux中rc的含义
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
[轉]redis;mongodb;memcache三者的性能比較
查看>>
让你的WPF程序在Win7下呈现Win8风格主题
查看>>
802.11 学习笔记
查看>>
构建Docker Compose服务堆栈
查看>>
浮点数内存如何存储的
查看>>