• Serializable中的serialVersionUID


    有序列化,就必然有反序列化!比如在A端为UserLogin(见上一篇对象序列化)做了序列化,然后在B端进行反序列化。

    首先需要,A端和B端都定义有相同的UserLogin类。可是,万一两端的UserLogin定义不一致呢?这就需要serialVersionUID

    简单来说,serialVersion类似于软件的版本号,如果软件的发布以对应的版本号作为标识。那么serialVersionUID就是对当前序列化类做出的标识。

    一般情况下,A端在做序列化时,也会将对应的serialVersionUID存储在文件中,在B端进行反序列化时,首先将文件中的serialVersionUID与B端UserLogin类的serialVersionUID做比较,如果一致,则进行反序列化操作,否则,反序列化操作失败。

    一、serialVersionUID定义的方式

    serialVersionUID有两种生成方式:

    (1)直接显式指定

    1 private static final  long   serialVersionUID = 1L;

    (2)自动生成

    若类中没有显式指定serialVersionUID,则程序会根据类名、接口名、属性和方法自动生成一个。

    二、序列化的使用

    在A端为UserLogin(见上一篇对象序列化)做了序列化;那么在B端也创建一个相同的UserLogin类;

    (1)序列化实体类

     1 package com.sf.code.serial;
     2 
     3 import java.io.Serializable;
     4 
     5 public class Person implements Serializable {
     6     private static final long serialVersionUID = 123456789L;
     7     public int id;
     8     public String name;
     9 
    10     public Person(int id, String name) {
    11         this.id = id;
    12         this.name = name;
    13     }
    14 
    15     public String toString() {
    16         return "Person: " + id + " " + name;
    17     }
    18 }

    (2)A端做对象序列化

     1 package com.sf.code.serial;
     2 
     3 import java.io.FileOutputStream;
     4 import java.io.IOException;
     5 import java.io.ObjectOutputStream;
     6 
     7 public class SerialTest {
     8 
     9     public static void main(String[] args) throws IOException {
    10         Person person = new Person(1234, "wang");
    11         System.out.println("Person Serial" + person);
    12         FileOutputStream fos = new FileOutputStream("Person.txt");
    13         ObjectOutputStream oos = new ObjectOutputStream(fos);
    14         oos.writeObject(person);
    15         oos.flush();
    16         oos.close();
    17     }
    18 }

    (3)B端做反序列化

     1 package com.sf.code.serial;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.ObjectInputStream;
     6 
     7 public class DeserialTest {
     8     public static void main(String[] args) throws IOException, ClassNotFoundException {
     9         Person person;
    10 
    11         FileInputStream fis = new FileInputStream("Person.txt");
    12         ObjectInputStream ois = new ObjectInputStream(fis);
    13         person = (Person) ois.readObject();
    14         ois.close();
    15         System.out.println("Person Deserial" + person);
    16     }
    17 }

    三、使用规则

    (1)假设A端和B端的serialVersionUID一致,A端不变,B端增加一个字段:

    执行序列化、反序列化操作正常,B端新增字段的属性值被初始化为默认值。

    (2)假设A端和B端的serialVersionUID一致,A端不变,B端减少一个字段:

    执行序列化、反序列化操作正常,B端减少的字段被忽略,其它字段正常。

    (3)假设A端和B端的serialVersionUID一致,A端增加一个字段,B端不变:

    执行序列化、反序列化操作正常,A端新增字段被B端忽略。

    (4)假设A端和B端的serialVersionUID一致,A端减少一个字段,B端不变:

    执行序列化、反序列化操作正常,A减少字段在B端被初始化为默认值。

  • 相关阅读:
    服务器连接华为存储配置操作
    ZABBIX 3.0 配置监控NGINX性能【OK】
    使用jvisualvm工具来监控java运行情况
    运行python时提示:ImportError: No module named plyvel ,ImportError No module named irc 解决过程:
    centos7安装ZABBIX 3.0+ 邮件报警【OK】
    给阿里云ECS主机添加IPV6地址
    出现错误日志:The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path
    [Z3001] connection to database 'zabbix' failed: [1045] Access denied for user 'zabbix'@'localhost' (using password: YES)
    LINUX安全加固操作
    【转】解决virtmanager启动管理器出错:unsupported format character
  • 原文地址:https://www.cnblogs.com/yy20141204bb/p/10571144.html
Copyright © 2020-2023  润新知