现代替代方案:JSON 与 Protocol Buffers
使用 Jackson JSON 和 Protocol Buffers 替代 Java 序列化,实现可移植且安全的持久化
现代替代方案:JSON 与 Protocol Buffers 是 CoddyKit 上的免费 Java Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
为什么替换 Java 序列化?
Java 序列化仅适用于 JVM,格式冗长、速度慢,并且存在安全风险。现代应用更倾向于使用 JSON(可读性好且与语言无关)或协议缓冲区(紧凑、基于模式且速度快)。
Jackson:事实上的 JSON 库
Jackson 的 ObjectMapper 可以将对象转换为 JSON 字符串,也可以将 JSON 字符串转换回对象。请将 com.fasterxml.jackson.core:jackson-databind 添加到项目中。
ObjectMapper mapper = new ObjectMapper();
User user = new User("Alice", 30);
String json = mapper.writeValueAsString(user);
System.out.println(json); // {"name":"Alice","age":30}
User restored = mapper.readValue(json, User.class);使用注解自定义 Jackson
使用 @JsonProperty、@JsonIgnore、@JsonAlias 和 @JsonFormat 控制序列化,而无需更改模型中的字段名。
public class Product {
@JsonProperty("product_name")
private String name;
@JsonIgnore
private String internalCode;
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate releaseDate;
}Jackson 模块:Java 时间支持
注册 JavaTimeModule,即可正确序列化 LocalDate、LocalDateTime 和 Instant,避免得到一个充满字段的 JSON 对象。
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String json = mapper.writeValueAsString(LocalDate.now());
System.out.println(json); // "2024-06-15"GSON 作为轻量级替代方案
Google 提供的 GSON 比 Jackson 更简单:基本类型无需配置,但在大规模使用时,注解的丰富程度和性能不如 Jackson。
Gson gson = new Gson();
String json = gson.toJson(new User("Bob", 25));
User user = gson.fromJson(json, User.class);什么是协议缓冲区?
协议缓冲区(Protobuf)是 Google 的二进制序列化格式。您可以定义一个 .proto 模式,将其编译为 Java 类,并获得带有内置版本管理功能的紧凑消息。
// user.proto
syntax = "proto3";
message UserProto {
string name = 1;
int32 age = 2;
}编码协议缓冲区消息
生成的类具有构建器 API。调用 toByteArray() 获取二进制载荷,并调用 parseFrom(bytes) 对其进行解码。
UserProto user = UserProto.newBuilder()
.setName("Alice")
.setAge(30)
.build();
byte[] bytes = user.toByteArray();
UserProto restored = UserProto.parseFrom(bytes);
System.out.println(restored.getName());JSON 与协议缓冲区的权衡
JSON 具有可读性且无需模式;协议缓冲区的大小缩小为原来的 1/3 到 1/10,速度也更快,但需要模式和代码生成。REST API 适合使用 JSON,高吞吐量的内部服务适合使用协议缓冲区。
使用协议缓冲区进行模式演进
协议缓冲区字段使用编号而不是名称。您可以安全地添加新字段或弃用旧字段,而不会破坏现有客户端——前提是绝不能重新使用字段编号。
// v2 of user.proto — backwards compatible
message UserProto {
string name = 1;
int32 age = 2;
string email = 3; // new in v2
}从 Java 序列化迁移
将使用 ObjectOutputStream 的写入路径替换为 ObjectMapper.writeValue() 或协议缓冲区的 writeTo()。仅在迁移旧数据时保留旧的序列化方式。
安全性:不存在反序列化利用链
JSON 和协议缓冲区在反序列化期间不会调用任意构造函数或方法,因此可以消除困扰 Java 序列化的利用链攻击。
快速检查
协议缓冲区相比 JSON 的一项主要优势是什么?
回顾
对于 REST 和可读性,请使用 Jackson JSON 替代 Java 序列化;对于对性能要求高的服务,请使用协议缓冲区。两者都支持跨语言使用、模式演进,并且在设计上具有安全性。
常见问题解答
「现代替代方案:JSON 与 Protocol Buffers」课时是免费的吗?
是的 — 「现代替代方案:JSON 与 Protocol Buffers」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「现代替代方案:JSON 与 Protocol Buffers」这节课中我会学到什么?
使用 Jackson JSON 和 Protocol Buffers 替代 Java 序列化,实现可移植且安全的持久化 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「现代替代方案:JSON 与 Protocol Buffers」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Java 序列化基础
- transient 字段与 serialVersionUID
- 自定义序列化:writeObject 与 readObject
- 现代替代方案:JSON 与 Protocol Buffers