0Pricing
Java Academy · 课时

现代替代方案: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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Java 序列化基础
  2. transient 字段与 serialVersionUID
  3. 自定义序列化:writeObject 与 readObject
  4. 现代替代方案:JSON 与 Protocol Buffers
← 返回 Java Academy