跳到主要内容
版本:dev

概述

Apache Fory™ 是一个由 JIT 编译零拷贝 技术和 高级代码生成 驱动的超高性能多语言序列化框架,可实现高达 170 倍性能提升,同时保持简洁易用。

快速示例

跨语言序列化,在 Rust 中序列化,在 Python 中反序列化:

Rust

use fory::{Fory, ForyObject};

#[derive(ForyObject, Debug, PartialEq)]
struct User {
name: String,
age: i32,
}

fn main() {
let mut fory = Fory::default().xlang(true);
fory.register::<User>(1);

let user = User { name: "Alice".to_string(), age: 30 };
let bytes = fory.serialize(&user).unwrap();
let decoded: User = fory.deserialize(&bytes).unwrap();
println!("{:?}", decoded); // User { name: "Alice", age: 30 }
}

Python

import pyfory
from dataclasses import dataclass

@dataclass
class User:
name: str
age: pyfory.int32

fory = pyfory.Fory(xlang=True)
fory.register(User, type_id=1)

user = User(name="Alice", age=30)
data = fory.serialize(user)
decoded = fory.deserialize(data)
print(decoded) # User(name='Alice', age=30)

核心特性

高性能序列化

Apache Fory™ 通过先进的优化技术提供卓越性能:

  • JIT 编译:Java 运行时代码生成消除虚方法调用并内联热路径
  • 静态代码生成:Rust、C++ 和 Go 的编译时代码生成,无运行时开销即可达到峰值性能
  • 零拷贝操作:无需中间缓冲区复制的直接内存访问;行格式支持随机访问和部分序列化
  • 智能编码:整数和字符串的变长压缩;数组的 SIMD 加速(Java 16+)
  • 元数据共享:类元数据打包减少跨序列化的冗余类型信息

跨语言序列化

xlang 序列化格式 支持跨编程语言的无缝数据交换:

  • 自动类型映射:语言特定类型之间的智能转换(类型映射
  • 引用保持:共享和循环引用在跨语言时正确工作
  • 多态支持:对象以其实际运行时类型进行序列化/反序列化
  • Schema 演进:可选的向前/向后兼容性支持 Schema 演进
  • 自动序列化:无需 IDL 或 Schema 定义;直接序列化任何对象,无需代码生成

行格式

针对分析工作负载优化的缓存友好型 行格式

  • 零拷贝随机访问:无需反序列化整个对象即可读取单个字段
  • 部分操作:选择性字段序列化和反序列化以提高效率
  • Apache Arrow 集成:无缝转换为列格式以用于分析流水线
  • 多语言支持:可用于 Java、Python、Rust 和 C++

安全性与生产就绪

企业级安全性和兼容性:

  • 类注册:基于白名单的反序列化控制(默认启用)
  • 深度限制:防止递归对象图攻击
  • 可配置策略:自定义类检查器和反序列化策略
  • 平台支持:Java 8-24、GraalVM 原生镜像、多操作系统平台

协议

Apache Fory™ 实现了针对不同场景优化的多个二进制协议:

协议使用场景核心特性
跨语言序列化跨语言对象交换自动序列化、引用、多态
Java 序列化高性能 Java 专用JDK 序列化的直接替代,快 100 倍
行格式分析和数据处理零拷贝随机访问、Arrow 兼容
Python 原生Python 专用序列化Pickle/cloudpickle 替代,性能更好

所有协议共享相同的优化代码库,一个协议的改进可以惠及其他协议。

文档

用户指南

指南描述源文件网站
Java 序列化Java 序列化综合指南Java 指南查看
跨语言序列化多语言对象交换Xlang 指南查看
行格式零拷贝随机访问格式Java 行格式查看
PythonPython 特定功能和用法Python 指南查看
RustRust 实现和模式Rust 指南查看
GoGo 实现和用法Go 指南查看
ScalaScala 集成和最佳实践Scala 指南查看
GraalVM原生镜像支持和 AOT 编译GraalVM 指南查看
开发构建和贡献 Fory开发指南查看

协议规范

规范描述源文件网站
跨语言序列化跨语言二进制协议xlang_serialization_spec.md查看
Java 序列化Java 优化协议java_serialization_spec.md查看
行格式基于行的二进制格式row_format_spec.md查看
类型映射跨语言类型转换xlang_type_mapping.md查看

兼容性

Schema 兼容性

Apache Fory™ 支持 Java、Python、Rust 和 Golang 的类 Schema 向前/向后兼容,支持生产系统中的无缝 Schema 演进,无需跨所有服务协调升级。Fory 提供两种 Schema 兼容性模式:

  1. Schema 一致模式(默认):假设序列化和反序列化端之间的类 Schema 相同。此模式提供最小的序列化开销、最小的数据大小和最快的性能:适用于稳定的 Schema 或受控环境。

  2. 兼容模式:支持独立的 Schema 演进,具有向前和向后兼容性。此模式支持字段添加/删除、有限的类型演进和优雅处理 Schema 不匹配。在 Java 中使用 withCompatibleMode(CompatibleMode.COMPATIBLE) 启用,在 Python 中使用 compatible=True,在 Rust 中使用 compatible_mode(true),在 Go 中使用 NewFory(true)

二进制兼容性

当前状态:由于协议持续演进,Fory 主要版本之间不保证二进制兼容性。但是,次要版本之间(例如 0.13.x)保证兼容性。

建议

  • 按 Fory 主要版本对序列化数据进行版本控制
  • 升级主要版本时规划迁移策略
  • 详见升级指南

未来:从 Fory 1.0 版本开始将保证二进制兼容性。

安全

概述

序列化安全性因协议而异:

  • 行格式:使用预定义 Schema,本质上安全
  • 对象图序列化(Java/Python 原生):更灵活但需要仔细的安全配置

动态序列化可以反序列化任意类型,这可能会带来风险。例如,反序列化可能会调用 init 构造函数或 equals/hashCode 方法,如果方法体包含恶意代码,系统将面临风险。

Fory 默认启用动态协议的类注册,只允许受信任的已注册类型或内置类型。 除非您能确保环境安全,否则不要禁用类注册

如果禁用此选项,您需要对序列化安全负责。您应该实现并配置自定义的 ClassCheckerDeserializationPolicy 以进行细粒度的安全控制。

要报告 Apache Fory™ 中的安全漏洞,请遵循 ASF 漏洞报告流程

社区与支持

获取帮助

  • Slack:加入我们的 Slack 工作区参与社区讨论
  • Twitter/X:关注 @ApacheFory 获取更新和公告
  • GitHub Issues:在 apache/fory 报告错误和请求功能
  • 邮件列表:订阅 Apache Fory 邮件列表参与开发讨论

贡献

我们欢迎贡献!请阅读我们的贡献指南开始。

贡献方式

  • 报告错误和问题
  • 提出新功能
  • 改进文档
  • 提交 Pull Request
  • 添加测试用例
  • 分享基准测试

详见开发指南了解构建说明和开发工作流程。