📜  什么是 java 中的序列化 (1)

📅  最后修改于: 2023-12-03 15:06:24.595000             🧑  作者: Mango

什么是 Java 中的序列化

在 Java 编程语言中,序列化是将对象转换为字节流的过程,以便可以将其存储在磁盘上,通过网络发送或在进程之间传输。字节流可以在未来的某个时间重新还原为对象。

为什么需要序列化?

在大多数情况下,对象仅存在于应用程序的内存中。但是,有时需要将对象的构成保存在磁盘上以便以后使用,或者通过网络将其发送到其他计算机。在这些情况下,需要一种机制来将对象转换为基本字节表示形式。这就是序列化的作用。

Java中的序列化实现

Java 中提供了一个标准机制来进行序列化和反序列化,即 java.io.Serializable 接口。当类实现了 Serializable 接口时,该类的对象可以被序列化,即转换为字节流。示例如下:

import java.io.Serializable;

public class Student implements Serializable {
    private int studentId;
    private String name;
    private int age;

    // 省略 getter 和 setter 方法
}
序列化的示例

一个示例程序如下所示,将对象序列化并将其保存到文件中,然后将对象从文件中反序列化:

import java.io.*;

public class SerializationDemo {
    public static void main(String[] args) {
        try {
            // 序列化
            Student student = new Student();
            student.setStudentId(1001);
            student.setName("Tom");
            student.setAge(18);

            FileOutputStream fileOut = new FileOutputStream("student.ser");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(student);
            out.close();
            fileOut.close();

            System.out.println("Student object serialized successfully");

            // 反序列化
            FileInputStream fileIn = new FileInputStream("student.ser");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            Student deserializedStudent = (Student) in.readObject();
            in.close();
            fileIn.close();

            System.out.println("Deserialized Student object:");
            System.out.println("ID: " + deserializedStudent.getStudentId());
            System.out.println("Name: " + deserializedStudent.getName());
            System.out.println("Age: " + deserializedStudent.getAge());
        } catch (IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException c) {
            System.out.println("Student class not found");
            c.printStackTrace();
        }
    }
}

可以看到,该程序创建一个 Student 对象,将其序列化后将其保存到名为 student.ser 的文件中。在第二段代码中,程序从 student.ser 文件中读取对象并将其反序列化为 Student 类的对象,并通过 get 方法获取其值。输出结果如下所示:

Student object serialized successfully
Deserialized Student object:
ID: 1001
Name: Tom
Age: 18
序列化的注意事项
  • 静态字段的值不能序列化。
  • 不会序列化静态变量的值
  • 必须对对象中所有的字段都定义序列化ID
  • transient 和 static 修饰的字段不会被序列化。
  • 序列化的类和其所有超类必须是可序列化的。
总结

在 Java 中,序列化是一种用于将对象转换为字节流,以便可以将其存储在磁盘上,通过网络发送或在进程之间传输的机制。Java 中的序列化机制非常简单易用,只要实现了 Serializable 接口的类对象均可以被序列化。但是需要注意一些细节问题,例如静态字段的值不能序列化,必须对对象中所有的字段都定义序列化 ID 等。