Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23589
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 136
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-22 14:23
文章分类

全部博文(13)

文章存档

2015年(13)

我的朋友

分类: Java

2015-04-10 15:23:23

这篇博文讲了一些,可以作为参考
http://www.cnblogs.com/guanghuiqq/archive/2012/07/18/2597036.html

说说我目前对于序列化ID的理解
private static final long serialVersionUID = 6904545342348179087L;

1.序列化时会产生序列化ID(如果没有像红色部分那样显示定义),且就会根据编译的class(它通过类名、方法等诸多因素计算而得)自动生成一个序列化ID。反序列化时,2端的序列化ID必须一致(序列化端和反序列化端)才能进行反序列化,不然报错,local class incompatible。所以显示的定义红色部分才可能避免这种错误。而如果显示定义了红色部分的序列化ID,在以后对类添加删除字段时,也不会报错,只会有添加字段反序列化时被忽略或者被初始化为默认值的情况。详见链接博文。
2.如果一开始没有写序列化ID,后来再添加可以吗?可以,但是一般规范化是要求一开始就添加的。因为此时另一端已经存储了序列化后的数据,并且生成了序列化ID,那么这边此时是不能够随便指定序列化ID的,否则报错。简单的方法就是根据报错信息,将这边的显示指定序列化ID更改为那边生成的序列化ID即可。
3.根据上面的描述,可以看到,虽然序列化是针对某个对象进行的。但是序列化ID如果是自动生成,那么是和类的某个字段的具体值没有任何关系,不然通过那么多因素计算而得到的序列化ID肯定会和之前的不一致。

规范:序列化显示指定序列化ID才是王道。



阅读(543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~