Apache Fory:国产序列化快枪手支持多语言的开源工具

Apache Fory是一个非常快速的多语言序列化框架,它彻底改变了系统和语言之间的数据交换。通过利用JIT编译和零拷贝技术,Fory提供了比其他序列化框架快170倍的性能,同时非常易于使用。

主要特点:

  • 跨语言序列化:Java,Python,C++,Go,JavaScript,Rust,Scala,科特林
  • ️零拷贝优化:最大限度地减少大型数据集的内存开销
  • Schema evolution:Forward/backward compatibility for evolving data structures(模式演化:演化数据结构的向前/向后兼容性)
  • 安全第一:类注册防止私有化漏洞
  • 多种协议:对象图、行格式和Java兼容模式

快速启动
Java序列化示例:


Fory fory = Fory.builder().build();
fory.register(DataModel.class);

DataModel obj = new DataModel(/*...*/);
byte[] bytes = fory.serialize(obj);
DataModel restored = (DataModel) fory.deserialize(bytes);

Python序列化示例


from dataclasses import dataclass
import pyfory

class Foo:
    name: str:
    age: int
pyfory.register(Foo)
bytes = pyfory.serialize(Foo("Shawn", 30))  Ultra-fast encoding
restored = pyfory.deserialize(bytes)  Instant decoding



为何用Fory?
有些东西,用普通的 Java 自带序列化(或者其他现成的兼容序列化器)根本搞不定。

我们这里的情况是:有一个很复杂的节点图结构。每个节点都在一个 HashMap 里记录了“谁指向我”和“我指向谁”,这样我们就能很快查到每条引用的类型

问题来了:因为这是 HashMap,里面放进去的对象很多时候还没完全初始化(就是“半成品”对象),结果就会出 哈希计算错误。最后一拆开再拼回去的时候,有些节点就直接丢了,没法还原。

解决思路有:可以先把这个结构压平(扁平化),然后在重建的时候再分层次重新划分。但好消息是:Fory 这个库(一个高性能序列化框架)处理得非常好,不会踩坑。

换句话说就是:Java 自带的那套不行,Fory更靠谱。



Fory有何特点

它的定位就是:给你一个比别的序列化框架更快的替代品

在他们的 GitHub 主页(README)里,其实已经放了不少性能对比:比如和 JDK 自带的序列化KryoProtostuff 这些框架做过横向对比。

以前他们还做过一个模板项目,你可以在这个项目的基础上扩展,把它和其他基于 JMH 的性能测试框架放在一起跑对比。

另外,他们还内置了一些示例对比:比如 Avaje JSONb,还有大家熟知的 Jackson。有趣的是,Jackson 其实还支持一种二进制输出模式,不过大多数人压根儿不知道。

一句话总结:它不仅快,还贴心地帮你准备了对比和测试环境,顺手教育你 Jackson 还有隐藏技能。


| 框架/方式                           | 特点/优缺点
| JDK 自带序列化      | 原始自带,兼容性好,但速度慢、体积大,基本没人真正在高性能场景用。                  
| Kryo                           | 很多人用的 Java 序列化库,比 JDK 快很多,但配置起来比较麻烦,对象复杂时容易踩坑。    
| Protostuff                | 基于 Protobuf 的一种 Java 库,序列化速度快,压缩率高,但用起来不算直观。    
| Jackson (JSON)    | 大名鼎鼎,生态最丰富,序列化成 JSON 可读性强,但性能一般,体积偏大。              
| Jackson (二进制)  | 很多人不知道的隐藏模式,可以直接输出二进制,比 JSON 快一些,但鲜有人用。            
| Avaje JSONb          | 一个相对轻量的 JSON 序列化库,性能比 Jackson 好一些,适合对性能有点要求的 JSON 场景。
| Fury                          | 新晋选手,主打 极致性能 + 易用,比上面几乎所有方案都快,还贴心准备了性能测试模板。      

总结:如果只是图方便,Jackson 就够用了;如果追求速度,以前大家会选 Kryo/Protostuff,现在更推荐 Fury。