Java 中的对象序列化和反序列化的概念
- 对象序列化:指的是把 Java 对象转化为字节序列的过程。这样一来,对象就能在网络上传输,或者保存到磁盘文件里。
- 对象反序列化:和序列化相反,它是把字节序列重新恢复成 Java 对象的过程。借助反序列化,你可以从网络或文件中读取对象数据,然后在程序里恢复成可用的对象。
作用
- 数据持久化:可以把对象保存到文件或者数据库里,在需要的时候再恢复出来,以此实现数据的持久存储。
- 网络传输:在分布式系统中,对象能通过网络传输到其他节点。将对象序列化后变为字节流,就可以在网络中传输,到达目标节点后再反序列化为对象。
- 远程方法调用(RMI):在 Java 的 RMI 机制里,对象序列化和反序列化是实现远程方法调用的基础。调用远程方法时,需要把参数对象序列化后传输到远程服务器,服务器再进行反序列化并执行方法,最后将结果序列化返回给客户端。
实现对象的序列化和反序列化
实现条件
若要让一个对象能够被序列化,该类必须实现 java.io.Serializable
接口。Serializable
接口是一个标记接口,没有任何方法,它的作用就是表明实现该接口的类可以被序列化。
示例代码
下面是一个简单的示例,展示了如何实现对象的序列化和反序列化:
ObjectSerializationExample.java
import java.io.*;
// 定义一个可序列化的类
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class ObjectSerializationExample {
public static void main(String[] args) {
// 创建一个 Person 对象
Person person = new Person("Alice", 25);
// 序列化对象到文件
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("对象序列化成功,保存到 person.ser 文件中。");
} catch (IOException e) {
e.printStackTrace();
}
// 从文件中反序列化对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("对象反序列化成功,姓名:" + deserializedPerson.getName() + ",年龄:" + deserializedPerson.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
代码解释
- 定义可序列化的类:
Person
类实现了Serializable
接口,这样该类的对象就能被序列化。 - 序列化对象:使用
ObjectOutputStream
把Person
对象写入到文件person.ser
中。 - 反序列化对象:使用
ObjectInputStream
从文件person.ser
中读取字节序列,然后将其反序列化为Person
对象。
注意事项
- 静态成员变量不会被序列化,因为静态成员变量属于类,而不是对象。
- 若类中有非序列化的成员变量,需要将其声明为
transient
,这样在序列化时会忽略该变量。