📅  最后修改于: 2023-12-03 15:06:24.595000             🧑  作者: Mango
在 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
在 Java 中,序列化是一种用于将对象转换为字节流,以便可以将其存储在磁盘上,通过网络发送或在进程之间传输的机制。Java 中的序列化机制非常简单易用,只要实现了 Serializable 接口的类对象均可以被序列化。但是需要注意一些细节问题,例如静态字段的值不能序列化,必须对对象中所有的字段都定义序列化 ID 等。