跳到主要内容
版本:dev

特性

核心能力

高性能序列化

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 演进,允许序列化端和反序列化端使用不同的类型定义。这使分布式系统中的服务可以独立演进而不破坏兼容性:

  • 新增带默认值的字段
  • 删除废弃字段(反序列化时跳过)
  • 修改字段可空性(TOption<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$1apply$default$2 的方法,用于返回默认值。Fory 可以识别这些方法,并在反序列化时为缺失字段应用默认值。

Kotlin 特性

Kotlin 支持建立在默认的 Fory Java 实现之上,并增加了对 Kotlin 特有类型和 Schema 演进的处理能力。

支持的类型

  • 基础类型:ByteBooleanIntShortLongCharFloatDouble
  • 无符号类型:UByteUShortUIntULong
  • 通过默认 Java 实现支持字符串、标准数组和标准集合
  • Kotlin 集合和数组,例如 ArrayDequeArrayBooleanArrayByteArrayIntArrayLongArrayUByteArrayUIntArrayULongArray
  • 常见标准库类型,包括 PairTripleResultRegexRandomDurationUuid
  • Kotlin range 和 progression 类型,例如 CharRangeIntRangeLongRangeUIntRangeULongRange 及其对应的 progression 类型
  • 空集合,如 emptyListemptyMapemptySet

数据类默认值支持

在兼容模式下,Fory 可以识别 Kotlin 数据类的默认值,并在字段缺失时于反序列化阶段自动应用这些默认值。这使 Schema 演进更加安全,例如在新增带默认值字段时无需破坏兼容性。