在Java中,序列化和反序列化是两个与对象持久化和传输相关的过程。
序列化(Serialization):
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,当一个对象被序列化时,它被转化为字节流,这样它就可以被写入到输出流(例如文件或网络连接)中,或者可以被存储在内存中,然后稍后再反序列化回其原始形式。序列化主要有两个目的:对象的持久化(存储)和对象的传输(网络传输)。
2. 反序列化(Deserialization):
反序列化是序列化的逆过程。当一个对象被反序列化时,它从字节流转换回其原始的、可操作的对象形式。这通常发生在从输入流(例如文件或网络连接)读取对象的状态信息后。
如何使用:
Java提供了内置的序列化和反序列化机制。要使一个类可序列化,只需实现java.io.Serializable接口。这个接口是一个标记接口,没有任何方法需要实现。当一个类被标记为Serializable时,它的实例可以被序列化和反序列化。
以下是一个简单的例子:
import java.io.*;
public class Person implements Serializable {
private String name;
private int age;
// 构造器、getter和setter方法等...
}
要序列化一个Person对象:
Person person = new Person("Alice", 25);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);
oos.close();
要反序列化一个Person对象:
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Person deserializedPerson = (Person) ois.readObject();
ois.close();
注意:当一个类包含不能被序列化的字段(例如其他非序列化类的实例或文件句柄等),并且该字段是可变的时,实现自定义的writeObject和readObject方法通常是必要的。