特性
核心能力
高性能序列化
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 原生镜像及多种操作系统平台
Java 特性
高性能
- JIT 代码生成:高度可扩展的 JIT 框架可通过异步多线程编译在运行时生成序列化器代码,并通过以下方式带来 20-170 倍加速:
- 内联变量以减少内存访问
- 内联方法调用以消除虚分发开销
- 尽量减少条件分支
- 消除哈希查找
- 零拷贝:直接访问内存,无需中间缓冲区复制;行格式支持随机访问和部分序列化
- 变长编码:对整数和长整数进行优化压缩
- 元数据共享:缓存类元数据以减少冗余类型信息
- SIMD 加速:支持 Java Vector API 进行数组操作(Java 16+)
直接替换
- 100% 兼容 JDK 序列化:支持
writeObject/readObject/writeReplace/readResolve/readObjectNoData/Externalizable - 支持 Java 8-24:兼容所有现代 Java 版本,包括 Java 17+ 的 record
- GraalVM 原生镜像:支持 AOT 编译,无需反射配置
高级特性
- 引用跟踪:自动处理共享引用和循环引用
- Schema 演进:支持类 Schema 的向前和向后兼容
- 多态:完整支持继承层次结 构和接口
- 深拷贝:高效深拷贝复杂对象图并保留引用关系
- 安全性:支持类注册和可配置的反序列化策略
Python 特性
灵活的序列化模式
- Python 原生模式:完全兼容 Python,可直接替换 pickle/cloudpickle
- 跨语言模式:针对多语言数据交换进行优化
- 行格式:面向分析工作负载的零拷贝行格式
多样化的序列化特性
- 支持共享引用和循环引用:适用于 Python 原生模式和跨语言模式下的复杂对象图
- 支持多态:对自定义类型进行自动类型分发
- 支持 Schema 演进:在跨语言模式下,对 dataclass 提供向前和向后兼容能力
- 支持带外缓冲区:可对 NumPy 数组、Pandas DataFrame 等大型数据结构进行零拷贝序列化,并兼容 pickle protocol 5
极速性能
- 性能极快:相比其他序列化框架具有明显性能优势
- 运行时代码生成 与 Cython 加速 的核心实现,可提供最佳性能
紧凑的数据大小
- 紧凑的对象图协议:空间开销极低,相比 pickle/cloudpickle 最多可减少 3 倍数据大小
- 元数据打包与共享:可减少类型向前和向后兼容带来的额外空间开销
安全与可靠性
- 严格模式:通过类型注册和校验,防止反序列化不受信任的类型
- 引用跟踪:可安全处理循环引用
Rust 特性
为什么选择 Apache Fory™ Rust?
- 极致性能:支持零拷贝反序列化和优化的二进制协议
- 跨语言:可在 Java、Python、C++、Go、JavaScript 和 Rust 之间无缝序列化和反序列化数据
- 类型安全:通过 derive macro 在编译期进行类型检查
- 循环引用:自 动跟踪共享引用和循环引用,支持
Rc/Arc与弱引用 - 多态:支持对
Box<dyn Trait>、Rc<dyn Trait>和Arc<dyn Trait>等 trait 对象进行序列化 - Schema 演进:兼容模式支持类型定义独立演进
- 双模式:同时支持对象图序列化和零拷贝行格式
对象图序列化
自动序列化复杂对象图,并保留对象之间的结构和关系。#[derive(ForyObject)] macro 会在编译期生成高效的序列化代码,从而消除运行时开销:
- 支持任意深度的嵌套 struct 序列化
- 支持集合类型(Vec、HashMap、HashSet、BTreeMap)
- 支持枚举类型
- 通过
Option<T>支持可选字段 - 自动处理基础类型和字符串
- 使用变长整数实现高效二进制编码
共享引用与循环引用
通过 Rc<T> 和 Arc<T> 自动跟踪并保留共享对象的引用标识。当同一个对象被多次引用时,Fory 只会序列化一次,并在后续位置使用引用 ID。这带来以下好处:
- 空间效率:序列化结果中不会重复存储相同数据
- 引用标识保持:反序列化后的对象会保留相同的共享关系
- 支持循环引用:可使用
RcWeak<T>和ArcWeak<T>断开循环
Trait 对象序列化
通过 trait 对象实现多态序列化,从而支持动态分发和类型灵活性。这对插件系统、异构集合和可扩展架构非常重要。支持的 trait 对象类型包括:
Box<dyn Trait>- 拥有所有权的 trait 对象Rc<dyn Trait>- 引用计数 trait 对象Arc<dyn Trait>- 线程安全的引用计数 trait 对象Vec<Box<dyn Trait>>、HashMap<K, Box<dyn Trait>>- trait 对象集合
Schema 演进
在 兼容模式 下支持 Schema 演进,允许序列化端和反序列化端使用不同的类型定义。这使分布式系统中的服务可以独立演进而不破坏兼容性:
- 新增带默认值的字段
- 删除废弃字段(反序列化时跳过)
- 修改字段可空性(
T↔Option<T>) - 调整字段顺序(按名称匹配,而非按位置匹配)
- 对缺失字段进行类型安全的默认值回退
自定义序列化器
对于不支持 #[derive(ForyObject)] 的类型,可以手动实现 Serializer trait。这适用于以下场景:
- 其他 crate 中的外部类型
- 有特殊序列化需求的类型
- 与旧数据格式兼容
- 对性能要求极高的自定义编码
基于行的序列化
高性能 行格式 支持零拷贝反序列化。与传统对象序列化需要在内存中重建整个对象不同,行格式支持直接从二进制数据中 随机访问 字段,而无需完整反序列化。
- 零拷贝访问:读取字段时无需分配或复制数据
- 部分反序列化:只访问需要的字段
- 内存映射文件:可处理大于 RAM 的数据
- 缓存友好:顺序内存布局可更高效利用 CPU 缓存
- 惰性求值:将高成本操作延迟到字段访问时再执行
Scala 特性
支持的类型
Apache Fory™ 支持所有 Scala 对象序列化:
- 支持
case class序列化 - 支持
pojo/bean类序列化 - 支持
object单例序列化 - 支持
collection序列化 - 其他类型如
tuple/either以及基础类型也都支持
同时支持 Scala 2 和 Scala 3。
Scala 类默认值支持
Fory 在兼容模式下支持 Scala 类在反序列化时使用默认值。该特性使 case class 或普通 Scala 类在带有默认参数时也能实现向前和向后兼容。
当 Scala 类带有默认参数时,Scala 编译器会在伴生对象中(针对 case class)或类自身中(针对普通 Scala 类)生成类似 apply$default$1、apply$default$2 的方法,用于返回默认值。Fory 可以识别这些方法,并在反序列化时为缺失字段应用默认值。
Kotlin 特性
Kotlin 支持建立在默认的 Fory Java 实现之上,并增加了对 Kotlin 特有类型和 Schema 演进的处理能力。
支持的类型
- 基础类型:
Byte、Boolean、Int、Short、Long、Char、Float、Double - 无符号类型:
UByte、UShort、UInt、ULong - 通过默认 Java 实现支持字符串、标准数组和标准集合
- Kotlin 集合和数组,例如
ArrayDeque、Array、BooleanArray、ByteArray、IntArray、LongArray、UByteArray、UIntArray和ULongArray - 常见标准库类型,包括
Pair、Triple、Result、Regex、Random、Duration和Uuid - Kotlin range 和 progression 类型,例如
CharRange、IntRange、LongRange、UIntRange、ULongRange及其对应的 progression 类型 - 空集合,如
emptyList、emptyMap和emptySet
数据类默认值支持
在兼容模式下,Fory 可以识别 Kotlin 数据类的默认值,并在字段缺失时于反序列化阶段自动应用这些默认值。这使 Schema 演进更加安全,例如在新增带默认值字段时无需破坏兼容性。