跳到主要内容

Apache Fory™

一个面向原生领域对象、Schema IDL 和跨语言数据交换的高性能多语言序列化框架。

核心能力

Fory 面向这些问题而设计。

Fory 将跨语言序列化、原生对象支持、Schema IDL/codegen、引用跟踪、Schema 演进和 row-format 访问组合在一起。

快速开始

从原生领域对象开始。

用你的语言创建原生对象,然后分别通过一行 Fory 调用完成序列化和反序列化。

Java supports xlang and native modes, JIT serializers, schema evolution, and Java-native object graph features.

安装
<dependency>
<groupId>org.apache.fory</groupId>
<artifactId>fory-core</artifactId>
<version>1.2.0</version>
</dependency>
序列化 / 反序列化
import org.apache.fory.Fory;

public record Person(String name, int age) {}

Fory fory = Fory.builder()
.withXlang(true)
.build();
fory.register(Person.class, "Person");

byte[] bytes = fory.serialize(new Person("Alice", 30));
Person out = (Person) fory.deserialize(bytes);
Schema IDL

理解对象图的模型契约。

Fory IDL 从熟悉的 message 定义开始,并提供 union 与引用感知字段,表达普通 IDL 容易压平的对象模型。

01

Message 类型

用 typed fields、字段 ID 和明确的 optional 字段定义结构化数据类型。

02

Union 类型

把 one-of-several case 映射为 tagged union;在支持的语言中生成原生 union 或 sum type。

03

循环引用

当对象会被共享,或图结构中存在环时,用 ref 字段保留引用语义。

model.fdlFory IDL
package example;

message Dog {
string name = 1;
int32 bark_volume = 2;
}

message Cat {
string name = 1;
int32 lives = 2;
}

union Animal {
Dog dog = 1;
Cat cat = 2;
}

message Node {
string value = 1;
ref Node parent = 2;
list<ref Node> children = 3;
}
性能

面向高吞吐序列化路径而设计。

Fory 结合高效二进制编码和高度优化的 serializer,从 JIT 编译到静态生成代码。

查看完整性能图表
优化 Serializer

在各运行时使用 JIT serializer、source generator、macro、KSP 和 build_runner。

高效编码

将类型化对象编码为面向快速序列化和反序列化的高效二进制格式。

数据边界

让 Fory 匹配每一种数据边界。

使用同一层序列化能力,但根据数据跨越的边界选择不同 payload 表面。

语言边界

当不同语言服务需要直接交换同一份类型化载荷时,使用 xlang。

运行时边界

当对象只在同一运行时内流转,且对象图语义重要时,使用 native mode。

读取边界

当部分读取和分析类工作负载不应重建完整对象时,使用 row format。

采用路径

不改变对象模型地采用 Fory。

按数据边界选择 wire mode;当模型需要长期维护时推进到 Fory IDL;上线前用多语言 Benchmark 验证实际路径。

01

选择 wire mode

跨语言共享 payload 时使用 xlang;同运行时流量需要更完整的语言对象模型时使用 native mode。

使用指南
02

沉淀共享契约

用 Fory IDL 定义一次模型,生成多语言类型安全代码;契约演进时使用 optional、ref、union 或 service。

Schema IDL 指南
03

验证上线路径

按计划上线的运行时对比序列化/反序列化吞吐、payload 大小和复现实验步骤。

Benchmark 图表