Java 中序列化和反序列化

发布于:2025-04-09 ⋅ 阅读:(69) ⋅ 点赞:(0)

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 自定义 视实现而定 取决于你

网站公告

今日签到

点亮在社区的每一天
去签到