Apache Fory JSON或许可以替代FastJson

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

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细分了很多包,我们先看核心包:

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

日期仅支持LocalDateLocalDateTimeInstant

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

相关推荐
程序员良辰1 小时前
【TongWeb7的M11】 首次登录密码修改 & 开启控制台远程访问
java·中间件·tomcat
lichenyang4531 小时前
NestJS + Socket.IO 鉴权、用户房间与幂等邀请
前端·后端
吴声子夜歌1 小时前
Java面试——设计模式(四)
java·设计模式·面试
paopaokaka_luck1 小时前
基于springboot3+vue3+uniapp的剧本杀预约小程序(AI角色对话、协同过滤算法、地图Api、Echarts图形化分析)
java·前端·spring boot·学习·echarts
lichenyang4531 小时前
React 实时通知与异步竞态处理
前端·后端
一嘴一个橘子1 小时前
idea 的 双击Shift 全局搜索
java·ide·intellij-idea
nvvas1 小时前
最新版 IntelliJ IDEA 全面介绍:面向现代 Java 开发者的智能 IDE
java·ide·intellij-idea
circuitsosk1 小时前
Python 文件读写与上下文管理器:with 语句为什么是最佳选择
java·服务器·python·文件操作·上下文管理器·contextlib