Java序列化是将对象状态转换为字节流的技术,用于数据持久化和网络传输,是分布式系统的基石。以下从工具、方法、实践、对比、场景到高阶应用,为你全面梳理。
一、Java序列化工具全景图
Java序列化工具按数据格式和应用场景可分为三大类:
| 分类 | 代表工具 | 数据格式 | 核心特点 |
|---|---|---|---|
| JDK原生 | Serializable / Externalizable | 二进制 | 无需外部依赖,性能最差,不跨语言 |
| JSON文本型 | Jackson / Gson / Fastjson2 | JSON | 人类可读,生态丰富,调试方便 |
| 高性能二进制型 | Kryo / FST / Protobuf / Thrift / Avro | 二进制 | 体积小、速度快,适合高性能RPC |
二、序列化方法详解
2.1 JDK原生序列化
实现 java.io.Serializable 接口,借助 ObjectOutputStream / ObjectInputStream 完成:
java
// 序列化 public static byte[] serialize(Object obj) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(obj); oos.close(); return baos.toByteArray(); } // 反序列化 public static <T> T deserialize(byte[] bytes) throws Exception { ByteArrayInputStream bais = new ByteInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); T obj = (T) ois.readObject(); ois.close(); return obj; }Externalizable 是 Serializable 的子接口,需要开发者实现 writeExternal / readExternal 方法,可精细控制序列化字段。
2.2 Kryo — 高性能Java专用
Kryo 通过显式注册类和字节码生成技术,实现高性能序列化:
java
Kryo kryo = new Kryo(); kryo.register(MyClass.class); // 显式注册,提升性能 // 序列化 Output output = new Output(new FileOutputStream("file.bin")); kryo.writeObject(output, object); output.close(); // 反序列化 Input input = new Input(new FileInputStream("file.bin")); MyClass obj = kryo.readObject(input, MyClass.class); input.close();⚠️ 注意:Kryo 非线程安全,多线程环境下需每个线程独立实例或使用池化。
2.3 FST — 兼容JDK的高性能替代
FST 完全兼容JDK序列化协议,可直接替换,速度可达JDK的10倍,体积仅为1/3:
java
// 快捷方式 FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration(); byte[] bytes = conf.asByteArray(obj); Object obj2 = conf.asObject(bytes);
在 Dubbo 中启用 FST 只需一行配置:
xml
<dubbo:protocol serialization="fst"/>
2.4 Protobuf — 跨语言标准
需要先定义 .proto 文件,编译生成 Java 代码:
protobuf
syntax = "proto3"; message Person { string name = 1; int32 age = 2; }java
// 序列化 Person person = Person.newBuilder().setName("John").setAge(30).build(); byte[] bytes = person.toByteArray(); // 直接序列化为字节数组 // 反序列化 Person person2 = Person.parseFrom(bytes);[reference:13]2.5 Jackson — JSON序列化事实标准
Spring Boot 默认集成,通过注解驱动: