java中serialVersionUID作用
一般在模型类中且实现了Serializable接口,会有一个serialVersionUID字段,通常写作:
private static final long serialVersionUID = xxxL;//xxx代表整数
简单点说就是避免在对字节流进行反序列化时,检测到对象的字段和原先序列化时的字段不一致时,报Exception的问题。
什么时候回出现这种问题呢?举个例子:
//服务器s1
public class A implements Serializable {
private static final long serialVersionUID = 123456L;
public Long id;
public String name;
}
//服务器s2
public class A implements Serializable {
private static final long serialVersionUID = 123456L;
public String name;
public String username;
}
我们有一个class A,分别在服务器s1和s2上,注意两个服务器上的class A的字段是不一样的,serialVersionUID字段值相同。现在由服务器s1创建一个对象a,序列化后传到s2。s2接收到字节数据后,进行反序列化操作,得到的a对象。由于字段不一致,在s2上的只能接收到name字段的值。
从某种意义上说s1上的class A和是s2上的class A是不同的对象,但是由于有serialVersionUID字段存在,在反序列操作时会去判断两个值是否相同,如果相同就会丢弃到没有的字段的值,只匹配有交集的字段。s2中有的字段,s1中没有,值就取默认值。
但,如果s1、s2中的的对象中serialVersionUID的值不相同,即使字段都能匹配上,也会抛出异常。说明在反序列化时,serialVersionUID是作为最重要的参考标准,如果没有该字段才要求字段需要完全相同。