假设一个英国人和另一个印度人都将分别执行序列化和反序列化。在这种情况下, 为了验证在印度的接收者是经过验证的人,JVM会创建一个唯一ID,称为SerialVersionUID。
在大多数情况下,序列化和反序列化这两个活动都是由具有相同系统和相同位置的单个人完成的。
但是在序列化中,发送者和接收者不是同一个人,即,这些人可能不同,机器或系统可能不同,并且位置必须不同。在序列化中,发送方和接收方都应仅在开始时具有.class文件,即,要进行序列化的人和准备反序列化的人仅应在开始时包含相同的.class文件。
序列化:序列化时,每个对象发送方JVM都会保存一个Unique Identifier。JVM负责根据发送方系统中存在的相应.class文件生成该唯一ID。
反序列化:反序列化时,接收方JVM将与对象关联的唯一ID与本地类Unique ID进行比较,即JVM还将基于接收方系统中存在的相应.class文件创建唯一ID。如果两个唯一的ID都匹配,则将仅执行反序列化。否则,我们将获得Runtime Exception,提示InvalidClassException。这个唯一的标识符不过是SerialVersionUID。
//必须实现Serializable接口,不然抛出NotSerializableException
public class DataClass implements Serializable {
// 自定义 SerialVersionUID,可序列化后修改,测试反序列化
private static final long serialVersionUID = 20000L;
String name = "sun";
int age = 21;
}
public class Receiver {
public static void main(String[] args) throws Exception {
// 从 test.txt反序列化
FileInputStream fis = new FileInputStream("test.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
DataClass g = (DataClass)ois.readObject();
System.out.println(g.age);
}
}
public class Sender {
public static void main(String[] args) throws IOException {
DataClass g = new DataClass();
// 序列化到该文件,实际可能是序列化到远程服务器
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.txt"));
oos.writeObject(g);
oos.close();
System.out.println("全路径:"+System.getProperty("user.dir")+"test.txt");
}
}
原文:https://www.cnblogs.com/yansum/p/12602561.html