zoukankan      html  css  js  c++  java
  • 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是作为最重要的参考标准,如果没有该字段才要求字段需要完全相同。

  • 相关阅读:
    cestos7安装zookeeper
    Cestos7安装Elasticsearch5.4.3
    debian使用nginx创建静态文件存储
    tomcat优化
    tomcat停止和启动脚本
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    redis设置bind
    Jenkins send build artifacts over ssh配置
    nginx 负载均衡5种配置方式
    Jenkins tomcat打包启动脚本,待完善
  • 原文地址:https://www.cnblogs.com/b3051/p/14506920.html
Copyright © 2011-2022 走看看