masterJ2SE篇007——Serializable serialVersionUID

来源:互联网 发布:nginx启用gzip压缩 编辑:程序博客网 时间:2024/06/11 09:11

我们在实现Serializable接口的时候,都会提示生成一个serialVersionUID
serialVersionUID的作用是:序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。


在Eclipse中,提供两种方式让我们快速添加SerialVersionUid。
1、add default serial version ID
生成默认的1L,例:private static final long serialVersionUID = 1L;
2、Adds a default serial version ID
生成一个很大的数,生成的数是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例:
private static final   long     serialVersionUID = -19131491768901425L;


首先我们要搞懂为什么需要这个ID,而且生成的是private static的,才能知道Eclipse为什么提供这样的两种方式。
在网络传输Java对象、将Java对象存储到文件、将Java对象以BLOB形式存储到数据库中时,需要对Java对象进行序列化及反序列化,标准模式是实现Serializable接口。
当然,现在实现对象存储的方式不仅仅有实现Serializable接口,还有些其他的,之后一起学习rpc的时候再一起学习吧。
实现上述接口时,需要提供一个Serial Version UID,该UID用于标识类的版本。一个对象被序列化后,只要其版本不变,都可以进行反序列化,一旦改变造成版本不一致,会抛出InvalidClassException异常。
建议显示定义UID,如果不显示定义,JVM会自动产生一个值,这个值和编译器的实现有关,不稳定,可能在不同JVM环境下出现反序列化抛出InvalidClassException异常的情况。


知道了上面的这几点,就很容易理解为什么生成的id是private static的了,static是因为所有这个类的对象拥有同一个id,所以设置为static的。为什么是private的呢?因为防止子类继承这个属性,比如A类有个子类B,如果A类没有变化,B类变化了,那么B类应该要变化它的id,而A类不变,那就冲突了。
再说为什么提供第一种1L的做法呢?如果我们想向下兼容,那么一直是1L就好了,如果不想向下兼容,那么每次发布的时候将id加1就好了。
那第一种不是挺好的吗?为什么提供第二种呢?我个人觉得第一种确实够用了,但是修改了类,直接删除id,再重新生成一下也方便。


另外这个uid,java并不是想说全局都是唯一的,而是想说一个类的id每次修改之后应该和之前的id不一样。


参考文章

http://www.tuicool.com/articles/fmMnuu

http://zengxiankang2011.blog.163.com/blog/static/1783603192011594938588/

0 0
原创粉丝点击