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 }

 

posted @ 2021-06-08 13:36  yub4by  阅读(68)  评论(0编辑  收藏  举报