Java中ObjectInputStream、ObjectOutputStream用法

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

文章目录

介绍

对象序列化和反序列化。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();
    }
}

这样直接写是会报错,不能序列化。
在这里插入图片描述
我们需要让 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 读取数据
在这里插入图片描述

猜你喜欢

转载自juejin.im/post/7018802512983490574