JavaSE-19.2.5【对象序列化/反序列化的三个问题(serialVersionUID&transient)】
1 package day10.lesson2.p2; 2 3 import java.io.*; 4 5 /* 6 2.8 对象序列化/反序列化的三个问题(serialVersionUID&transient) 7 8 serialVersionUID 9 1、用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢? 10 比如在类文件Student.java中重写toString() 11 会出问题,会抛出InvalidClassException异常,原因是类的串行版本与从流中读取的类描述符的类型不匹配 12 2、如果出问题了,如何解决呢? 13 给对象所属的类加一个serialVersionUID 14 private static final long serialVersionUID = 42L; xxL的xx可以修改 15 显式声明这个序列化ID后,修改类文件时不会再重新产生新的序列化ID,所以不会出现不匹配的情况 16 17 transient 18 1、如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢? 19 给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程 20 */ 21 public class ObjectStreamDemo { 22 23 public static void main(String[] args) throws IOException, ClassNotFoundException { 24 // write(); 25 read(); 26 } 27 28 //序列化 29 private static void write() throws IOException{ 30 ObjectOutputStream oos = new ObjectOutputStream( 31 new FileOutputStream("stage2\\src\\day10\\lesson2\\p2\\oos.txt") 32 ); 33 Student student = new Student("李四", 22); 34 oos.writeObject(student); 35 oos.close(); 36 } 37 38 //反序列化 39 private static void read() throws IOException, ClassNotFoundException{ 40 ObjectInputStream ois = new ObjectInputStream( 41 new FileInputStream("stage2\\src\\day10\\lesson2\\p2\\oos.txt") 42 ); 43 Object object = ois.readObject(); 44 Student student = (Student)object; 45 System.out.println(student.getName() + "," + student.getAge()); //李四,22 46 ois.close(); 47 /* 48 类文件Student.java中重写toString()后执行read(),不能正常输出,报异常如下 49 50 Exception in thread "main" java.io.InvalidClassException: 51 day10.lesson2.p2.Student; 52 local class incompatible: stream classdesc serialVersionUID = 9210176385428859121, 53 local class serialVersionUID = -4221202332391468166 54 55 异常原因:类的串行版本与从流中读取的类描述符的类型不匹配 56 Student类实现了序列化接口,因此会产生一个序列化ID serialVersionUID = 9210176385428859121 57 重写toString()之前,我们保存对象时,也保存了这个序列化ID 58 重写toString()时,即修改了Student类文件,会重新产生一个新的序列化ID serialVersionUID = -4221202332391468166 59 当我们读取原先保存的对象时,两个序列化ID不匹配 60 */ 61 62 /* 63 private transient int age; //设置age不被序列化 64 李四,0 65 成员变量int默认值0 66 */ 67 } 68 69 }
1 package day10.lesson2.p2; 2 3 import java.io.Serializable; 4 5 public class Student implements Serializable { 6 7 private static final long serialVersionUID = 42L; 8 private String name; 9 // private int age; 10 11 private transient int age; //设置age不被序列化 12 13 public Student() { 14 } 15 16 public Student(String name, int age) { 17 this.name = name; 18 this.age = age; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 public String getName() { 30 return name; 31 } 32 33 public int getAge() { 34 return age; 35 } 36 37 @Override 38 public String toString() { 39 return "Student{" + 40 "name='" + name + '\'' + 41 ", age=" + age + 42 '}'; 43 } 44 }