Java中serialVersionUID的解释

来源:互联网 发布:苹果怎么快捷打开数据 编辑:程序博客网 时间:2024/05/02 04:48

 serialVersionUID作用:
       序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
       一个是默认的1L,比如:private static final long serialVersionUID = 1L;
       一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
       private static final   long     serialVersionUID = xxxxL;

当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
     提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会
     自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也
      可以把它关掉的,设置如下:
        Window ==> Preferences ==> Java ==> 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,可避开不兼容性问题。

 

java在序列化的时候涉及到很多检查,serialVersionUID就是其中一个。 

那这个serialVersionUID有什么用处? 

这个值可以由类指定,也可以不指定。如果不指定的话java会根据class计算serialVersionUID,相当于hash的原理(但不是hash不要混淆),只要类没有变化,计算出来的serialVersionUID也会变化。 

它用在反序列化的时候“检查”当前的类是不是已经被修改过。如果发现serialVersionUID对不上号,那么会抛出 java.io.InvalidClassException的异常,这种情况发生在由于种种因素修改了序列化对象的类文件时。 

但是有时候我们有这样的需求,将A类对象序列化之后,版本升级,修改了A类,这时候,希望反序列化的时候还能认识之前版本的序列化对象。这时候serialVersionUID就在笑了,对,只要指定序列化对象类的serialVersionUID就可以了。 

指定了序列化对象的serialVersionUID,即使你删除了类的某个成员变量,其他未修改信息仍然能正确解析,对他就是这么变态。 

ps: 介绍下我的使用场景:我需要持久一些动态的配置,在每次修改之后,我都会将新的配置持久化到文件中。但是不想使用xml文件,虽然易懂,但是对我系统来说没有必要,我这个配置我是提供用户在页面上直接配置的,不需要打开XML文件来写(容易出错,还需要重启应用)。我现在的做法就是就配置文件写成一个类,配置项就是类中的成员变量,这样新加配置文件直接内存中分配一个配置对象,然后将次对象序列化到文件中,但是考虑到配置项可能会增加,但是我需要在配置类新加了配置项之后,之前的数据文件仍然能读取,于是就有了上面的尝试。