Java 中序列化和反序列化的详细说明
文章目录
- 前言
- 1. Java 内置序列化(Java Serialization)
- 1.1 介绍
- 1.2 优点
- 1.3 缺点
- 1.4 实现代码
- 2. JSON 序列化(使用 Jackson 库)
- 2.1 介绍
- 2.2 优点
- 2.3 缺点
- 2.4 实现代码
- 3. XML 序列化(使用 JAXB 库)
- 3.1 介绍
- 3.2 优点
- 3.3 缺点
- 3.4 实现代码
- 4. Protobuf 序列化(使用 Protocol Buffers)
- 4.1 介绍
- 4.2 优点
- 4.3 缺点
- 4.4 实现代码
- 总结
前言
在 Java 中,序列化(Serialization)是将对象转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输。反序列化(Deserialization)则是将字节流转换回对象的过程。Java 提供了多种序列化和反序列化的方式,每种方式都有其优缺点。本文将详细介绍这些方式,并提供具体的实现代码。
1. Java 内置序列化(Java Serialization)
1.1 介绍
Java 内置序列化是通过实现 Serializable 接口来实现的。它是最简单和最常用的序列化方式,但也有一些缺点,比如性能较低和安全性问题。
1.2 优点
- 简单易用:只需实现 Serializable 接口即可。
- 内置支持:Java 标准库直接支持。
1.3 缺点
- 性能较低:序列化和反序列化速度较慢。
- 安全性问题:可能导致反序列化漏洞。
- 版本兼容性:类结构变化可能导致反序列化失败。
1.4 实现代码
import java.io.*;// 实现 Serializable 接口
class Person implements Serializable {private static final long serialVersionUID = 1L; // 用于版本控制private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}
}public class JavaSerializationExample {public static void main(String[] args) {Person person = new Person("Alice", 30);// 序列化try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {oos.writeObject(person);System.out.println("Serialization complete."); // 输出序列化完成信息} catch (IOException e) {e.printStackTrace();}// 反序列化try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {Person deserializedPerson = (Person) ois.readObject();System.out.println("Deserialized Person: " + deserializedPerson); // 输出反序列化后的对象} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}
输出结果
Serialization complete.
Deserialized Person: Person{name=