Serialization 序列化

序列化指把 Java 对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程。

为什么需要序列化?

通过序列化能够实现对内存中的 对象对象进行持久化保存 或 网络传输。

无论是什么文件,通过序列化,最终都变成了字节流,能够以通用的格式进行传输或保存。

要想再次使用,就使用反序列化进行还原,对象还是对象,文件还是文件。

Java 对象实现 序列化 与 反序列化

要想让某一个类支持 序列化 与反 序列化非常简单,只需要让这个类实现 Serializable 接口即可,我们只需要在类的声明时写上 implements Serializable 即可,不需要做额外修改(比如重写方法)。

我们定义一个 Student 类:

public class Student implements Serializable {

    private int id;
    private String name;

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

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

随后进行序列化和反序列化操作:

// 对 Student 进行 序列化 和 反序列化
public class SerializationTest {

    public static void main(String[] args) {
        Student stu1=new Student(20210010,"Tom");

        //序列化
        try {
            FileOutputStream fos = new FileOutputStream("Tom.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(stu1);
            //清空缓冲,关闭窗口
            fos.flush();
            oos.flush();
            fos.close();
            oos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //反序列化
        try {
            FileInputStream fis=new FileInputStream("Tom.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Student stu2 = (Student)ois.readObject();
            //关闭窗口
            fis.close();
            ois.close();
            System.out.println(stu2);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }
}

在序列化过程中, 我们额外用到了两个类:

  • FileOutputStream, 文件输出流,用来指定输出文件的名称

  • ObjectOutputStream, 对象输出流,将对象写入文件中

在反序列化过程中, 我们额外用到了两个类:

  • FileInputStream, 文件输入流,用来指定读取文件的名称

  • ObjectInputStream, 对象输入流,将对象读到程序中

特别说明, 在输出缓冲流关闭前需要将缓冲清空, 也就是将缓冲区的内存释放调。

Last updated

Was this helpful?