主要特点:
- 跨语言序列化: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 自带的序列化、Kryo、Protostuff 这些框架做过横向对比。
以前他们还做过一个模板项目,你可以在这个项目的基础上扩展,把它和其他基于 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。