文章目录

介绍

对象序列化和反序列化。​​ObjectOutputStream​​​ 将对象信息按固定格式转成字节序列输出。​​ObjectInputStream​​ 将读取序列化字节值,恢复(重建)对象。

使用

创建对象

ObjectOutputStream out = new ObjectOutputStream(相接的流)

方法

ObjectOutputStream 特有的成员方法

writeObject(Object obj)//序列化输出

ObjectInputStream 特有的成员方法

readObject()//反序列化恢复对象

栗子1:序列化

创建 Student 类

class Student {
private int id;
private String name;
private String gender;
private int age;

public Student() {
}

public Student(int id, String name, String gender, int age) {
this.id = id;
this.name = name;
this.gender = gender;
this.age = age;
}

public void setId(int id) {
this.id = id;
}

public int getId() {
return id;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return
"\n" + "学号" + id +
"\n" + "姓名" + name +
"\n" + "性别" + gender +
"\n" + "年龄" + age;
}
}

Main

public class Main {
public static void main(String[] args) throws Exception {
Student s = new Student(2, "Errol", "男", 24);

ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("d:/abc/stu"));
out.writeObject(s);
out.close();
}
}

这样直接写是会报错,不能序列化。
【达内课程】ObjectInputStream、ObjectOutputStream_java
我们需要让 Student 类实现 Serializable。修改 Student 类如下:

/*
* Serializable是个空接口
* 标识接口
* 用来标识 Student 类型对象可以 被序列化
*/
class Student implements Serializable {
......
}

Tips:如果 Student 里还有其他类,这个类也要实现 Serializable 接口

运行程序会在 D 盘 abc 文件夹下生成 stu 文件,查看内容:
【达内课程】ObjectInputStream、ObjectOutputStream_java_02

栗子2:读取

ObjectInputStream in = new ObjectInputStream(
new FileInputStream("d:/abc/stu"));
Student s = (Student)in.readObject();
in.close();

System.out.println(s);

运行程序,输出:
【达内课程】ObjectInputStream、ObjectOutputStream_数据_03

序列化头部数据

新建 ObjectOutputStream 时,会自动先输出4个头部字节值。我们可以测试下,栗子 1 中,注释掉 ​​out.writeObject(s);​​​在运行程序,查看输出的 stu 文件
【达内课程】ObjectInputStream、ObjectOutputStream_java_04

这是为了方便读取,如果是这 4 个字节值,则后边是序列化的数据,如果不是这 4 个字节值,后面的就不是对象序列化数据了。

新建 ObjectInputStream 时,会自动先读取 4 个头部字节值,来确认后边的数据是否是对象序列化数据。如果不是会出现异常 invalid stream header

不序列化的成员

1、static 静态属于类,不随对象序列化输出
2、transient 临时,只在程序运行时,在内存中存在,不会被序列化持久地保存

修改 Student 类中变量为以下

private int id;
private String name;
private static String gender;
private transient int age;

执行栗子1 后查看 stu 内容
【达内课程】ObjectInputStream、ObjectOutputStream_序列化_05
执行栗子2 读取数据
【达内课程】ObjectInputStream、ObjectOutputStream_数据_06