Serializable中的serialVersionUID

时间:2023-03-09 05:53:24
Serializable中的serialVersionUID

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

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

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

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

一、serialVersionUID定义的方式

serialVersionUID有两种生成方式:

(1)直接显式指定

 private static final  long   serialVersionUID = 1L;

(2)自动生成

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

二、序列化的使用

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

(1)序列化实体类

 package com.sf.code.serial;

 import java.io.Serializable;

 public class Person implements Serializable {
private static final long serialVersionUID = 123456789L;
public int id;
public String name; public Person(int id, String name) {
this.id = id;
this.name = name;
} public String toString() {
return "Person: " + id + " " + name;
}
}

(2)A端做对象序列化

 package com.sf.code.serial;

 import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream; public class SerialTest { public static void main(String[] args) throws IOException {
Person person = new Person(, "wang");
System.out.println("Person Serial" + person);
FileOutputStream fos = new FileOutputStream("Person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(person);
oos.flush();
oos.close();
}
}

(3)B端做反序列化

 package com.sf.code.serial;

 import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; public class DeserialTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person; FileInputStream fis = new FileInputStream("Person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
person = (Person) ois.readObject();
ois.close();
System.out.println("Person Deserial" + person);
}
}

三、使用规则

(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端被初始化为默认值。