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

  • 相关阅读:
    java传值问题.
    方法重载
    java中各种运算符
    java中各种运算符
    java网址
    对象的初始化顺序
    Exploit,shellcode经验技巧杂谈
    关于16位的OS尝试
    window系统下的远程堆栈溢出 《实战篇》
    Exploit,shellcode经验技巧杂谈
  • 原文地址:https://www.cnblogs.com/b3051/p/14506920.html
Copyright © 2020-2023  润新知