Java 中的序列化(Serialization)和反序列化(Deserialization)是将对象和二进制数据(或其他格式)之间转换的过程,常见于对象传输、缓存、持久化等场景。
下面是 Java 中常见的几种 序列化/反序列化方式 👇:
🔹 1. Java 自带的序列化(JDK 默认)
✅ 特点:
- 使用
ObjectOutputStream
/ObjectInputStream
- 类必须实现
Serializable
接口 - 输出是二进制格式
💡 示例:
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.ser"));
oos.writeObject(myObject);
oos.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser"));
MyClass obj = (MyClass) ois.readObject();
ois.close();
⚠️ 缺点:
- 不跨语言
- 可读性差(是二进制)
- 修改类结构后容易出错(除非加
serialVersionUID
)
🔹 2. JSON 序列化(如 Jackson、Gson、Fastjson)
✅ 特点:
- 可读性强(文本格式)
- 跨语言、轻量
- 易调试、常用于 Web 接口通信
💡 Jackson 示例:
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(myObject); // 序列化
MyClass obj = mapper.readValue(json, MyClass.class); // 反序列化
🔹 3. XML 序列化(如 JAXB)
✅ 特点:
- 结构清晰
- 可跨平台、跨语言
- 常用于老系统或配置文件
💡 JAXB 示例:
// 序列化
JAXBContext context = JAXBContext.newInstance(MyClass.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(myObject, new File("data.xml"));
// 反序列化
Unmarshaller unmarshaller = context.createUnmarshaller();
MyClass obj = (MyClass) unmarshaller.unmarshal(new File("data.xml"));
🔹 4. Hessian / Kryo / Protobuf / Avro 等高性能方案
🏎️ Kryo
- 高性能二进制序列化库
- 比 Java 默认序列化快得多
- 适用于游戏、缓存、RPC 等场景
Kryo kryo = new Kryo();
Output output = new Output(new FileOutputStream("file.bin"));
kryo.writeObject(output, myObject);
output.close();
🧠 Protobuf(Google Protocol Buffers)
- 跨语言、高压缩比、高性能
- 常用于 RPC 框架(gRPC 等)
🔹 5. 自定义序列化
实现 Externalizable
接口,自定义 read/write 逻辑。
public class MyClass implements Externalizable {
private String name;
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(name);
}
public void readExternal(ObjectInput in) throws IOException {
name = in.readUTF();
}
}
🧾 总结对比表:
方式 | 格式 | 跨语言 | 性能 | 是否可读 |
---|---|---|---|---|
JDK 原生 | 二进制 | ❌ | 一般 | 否 |
JSON (Jackson) | 文本 | ✅ | 中等 | 是 |
XML (JAXB) | 文本 | ✅ | 较慢 | 是 |
Kryo | 二进制 | ❌ | 快 | 否 |
Protobuf | 二进制 | ✅ | 非常快 | 否 |
Externalizable | 自定义 | ❌ | 视实现而定 | 取决于你 |