Apache Fory JSON或许可以替代FastJson

61 阅读3分钟

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

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.5kstar

GitHub地址:github.com/apache/fory

官网地址:fory.apache.org/zh-CN/docs/…

03 快速实战-对象

3.1 引入依赖

Fory细分了很多包,我们先看核心包:

<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 载荷。

// 序列化
@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属性,序列化就会报错:

日期仅支持LocalDateLocalDateTimeInstant

直接序列化Date

直接序列化又是可以的:

04 快速实战-JSON

对应的JSON需要引入新的依赖。

4.1 引入依赖

<dependency>
    <groupId>org.apache.fory</groupId>
    <artifactId>fory-json</artifactId>
    <version>1.6.1</version>
</dependency>

4.2 简单使用

JSON的使用极其简单,和其他框架很类似,使用的关键类为:ForyJson

@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

 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 的功能远不止这些,感兴趣的话可以深入探索......