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 }