这篇博文讲了一些,可以作为参考
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) |