文章目录
- 介绍
 - 使用
 - 栗子1:序列化
 - 栗子2:读取
 - 序列化头部数据
 - 不序列化的成员
 
介绍
对象序列化和反序列化。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;
    }
    
    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();
    }
}这样直接写是会报错,不能序列化。
 我们需要让 Student 类实现 Serializable。修改 Student 类如下:
/*
 * Serializable是个空接口
 * 标识接口
 * 用来标识 Student 类型对象可以 被序列化
 */
class Student implements Serializable {
    ......
}Tips:如果 Student 里还有其他类,这个类也要实现 Serializable 接口
运行程序会在 D 盘 abc 文件夹下生成 stu 文件,查看内容:
栗子2:读取
ObjectInputStream in = new ObjectInputStream(
                new FileInputStream("d:/abc/stu"));
        Student s = (Student)in.readObject();
        in.close();
        System.out.println(s);运行程序,输出:
序列化头部数据
新建 ObjectOutputStream 时,会自动先输出4个头部字节值。我们可以测试下,栗子 1 中,注释掉 out.writeObject(s);在运行程序,查看输出的 stu 文件
这是为了方便读取,如果是这 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 内容
 执行栗子2 读取数据










