关注我的公众号:【编程朝花夕拾】,可获取首发内容。
01 引言
2026 年 7 月 21 日,一个足以震动整个 Java 圈的安全公告悄然发布------fastjson 1.2.68 至 1.2.83 全版本远程代码执行漏洞(CVE-2026-16723)被正式披露。这是 fastjson 1.x 的最后一个版本,也是"补丁打不动"的终极注脚。
与此同时,Apache Fory 作为一个由 JIT 和零拷贝技术驱动的多语言序列化框架,正在 Apache 基金会的孵化下迅速崛起,成为序列化领域最耀眼的明星。
02 简介
Apache Fory™ 是一个速度极快的多语言序列化框架,面向符合语言习惯的领域对象、 Schema IDL 和跨语言数据交换。
Fory 专为跨语言、跨执行平台的紧凑高吞吐序列化而设计。它可以直接处理应用对象,在需要稳定 契约时支持共享 Schema,并保留共享引用、循环引用和多态值的具体类型等对象图特性。

在GitHub上已经斩获4.5k的star。
GitHub地址:github.com/apache/fory
官网地址:fory.apache.org/zh-CN/docs/...
03 快速实战-对象
3.1 引入依赖
Fory细分了很多包,我们先看核心包:
xml
<dependency>
<groupId>org.apache.fory</groupId>
<artifactId>fory-core</artifactId>
<version>1.6.1</version>
</dependency>
其中主要针对Java对象的序列化
3.2 简单使用
Fory可以在 Java 的系统中替代 JDK 序列化、Kryo、FST、Hessian或者 Protocol Buffers 载荷。
java
// 序列化
@Test
void test01() {
Fory fory = Fory.builder().build();
OrderItem orderItem = new OrderItem();
orderItem.setId(1000L);
orderItem.setName("ws001");
fory.register(OrderItem.class);
byte[] serialize = fory.serialize(orderItem);
OrderItem deserialize = fory.deserialize(serialize, OrderItem.class);
System.out.println("deserialize: " + deserialize);
// deserialize: com.simonking.ws.boot.i18n.pojo.OrderItem@71c27ee8
}
// 拷贝对象
@Test
void test04() {
Fory fory = Fory.builder().build();
Order order = new Order();
order.setId(1L);
order.setName("ws");
order.setPrice(18.0);
fory.register(Order.class);
fory.register(OrderItem.class);
Order copy = fory.copy(order);
System.out.println("order: " + order) ;
System.out.println("copy: " + copy) ;
// order: com.simonking.ws.boot.i18n.pojo.Order@6d3c5255
// copy: com.simonking.ws.boot.i18n.pojo.Order@b1712f3
}
3.3 注意事项
注册
针对对象序列化和反序列化时,需要注册使用的类:fory.register(OrderItem.class)
否则就会出现异常:

Date逃逸
在序列化对象时,如果存在Date属性,序列化就会报错:

日期仅支持LocalDate、LocalDateTime、Instant。
直接序列化Date
直接序列化又是可以的:

04 快速实战-JSON
对应的JSON需要引入新的依赖。
4.1 引入依赖
xml
<dependency>
<groupId>org.apache.fory</groupId>
<artifactId>fory-json</artifactId>
<version>1.6.1</version>
</dependency>
4.2 简单使用
JSON的使用极其简单,和其他框架很类似,使用的关键类为:ForyJson
java
@Test
void test02() {
ForyJson foryJson = ForyJson.builder().build();
Date date = new Date();
User user = new User();
user.setId(1L);
user.setName("ws");
user.setAge(18);
user.setBirthDate(date);
String json = foryJson.toJson(user);
System.out.println(json);
User user1 = foryJson.fromJson(json, User.class);
System.out.println(user1);
}

这里的Date序列化不受影响,正常处理。默认转成json之后是时间戳。如果想要变成yyyy-MM-dd,则需要注册Codec。
java
ForyJson foryJson2 = ForyJson.builder()
.registerCodec(Date.class, DateYyyyMmDdCodec.INSTANCE)
.build();
05 小结
Fory 采用了根本性更安全的设计:
- 类型注册制:必须显式注册的类型才能被序列化/反序列化,不存在"数据决定类型"的攻击面
- 无
@type注入:序列化格式中不包含可被攻击者控制的类型标识 - Apache 基金会治理:安全流程规范,漏洞响应及时
- 二进制格式:相比 JSON 文本格式,攻击面更小
而Fastjson 1.x 以 CVE-2026-16723 画上了一个并不光彩的句号。从 2017 年到 2026 年,近十年间反复被绕过的 autoType 机制,成为 Java 安全史上最生动的反面教材。
Fory 的功能远不止这些,感兴趣的话可以深入探索......