Apache Fory 0.14 正式发布,支持高性能 C++ 序列化,跨语言互操作性和 Schema 演进功能

16 阅读8分钟

Apache Fory 团队很高兴地宣布 0.14.0 版本发布。这是一个主要版本,包含来自 11 位不同贡献者的 85 个 PR。请参阅安装页面了解如何获取适用于您平台的库。

亮点

  • 正式支持 C++:首次发布 Apache Fory C++,具有高性能对象图序列化、跨语言互操作性和 schema 演进功能
  • 行格式与类型系统:在 Java、Python 和 C++ 中新增面向行的格式类型系统,支持行列转换并移除 Arrow 依赖
  • 性能增强:所有语言的显著优化,包括 Rust 中的线程本地上下文和 C++ 类型分发的快速扁平整数映射
  • 生态系统更新:添加对 JDK 25(Java)、Go 1.23 和 Bazel 8 的支持。Python 正式标记为稳定版本,改进了构建并行性
  • 高级 Java 特性:通过 ForyFeature 支持 GraalVM Native Image,以及为阻塞队列和 final 字段优化的序列化器
  • ObjectStreamSerializer 重构:重构了 ObjectStreamSerializer,采用元数据共享的兼容模式,降低空间成本并提高 JDK 自定义序列化 API 的性能

C++:首次发布亮点

这是 Apache Fory C++ 的首次发布,为现代 C++17 提供完整、高性能的序列化框架。如果您构建需要快速序列化、跨语言通信或 schema 演进的 C++ 应用程序,Fory C++ 提供了类型安全、编译时序列化,且开销最小。

关键功能:

  • 通过 FORY_STRUCT 宏进行结构体注册,实现编译时类型安全
  • 与 Java、Python、Go、Rust 和 JavaScript 的跨语言序列化
  • 前向/后向兼容的 schema 演进(兼容模式)
  • 共享对象和循环引用的引用跟踪
  • 线程安全和单线程(最快)变体
  • 全面的类型支持:基本类型、std::stringstd::vectorstd::mapstd::setstd::optionalstd::shared_ptrstd::unique_ptrstd::variant 和时间类型
  • 用于分析工作负载的零拷贝行格式,支持随机字段访问
  • CMake(FetchContent)和 Bazel 构建系统支持

快速开始

#include "fory/serialization/fory.h"

using namespace fory::serialization;

struct Person {
  std::string name;
  int32_t age;
  std::vector<std::string> hobbies;
  FORY_STRUCT(Person, name, age, hobbies);
};

int main() {
  auto fory = Fory::builder()
      .xlang(true)       // 启用跨语言模式
      .track_ref(false)  // 禁用引用跟踪
      .build();
  fory.register_struct<Person>(1);

  Person person{"Alice", 30, {"reading", "coding"}};
  auto bytes = fory.serialize(person).value();
  Person decoded = fory.deserialize<Person>(bytes).value();
  // person == decoded
  return 0;
}

C++ 基准测试

以下是时间结果(纳秒;越低越好),比较了 Fory 与 Protobuf 在不同数据结构上的性能。

注意:结果取决于硬件和实现版本。有关如何自行运行基准测试,请参阅 C++ 基准测试指南:github.com/apache/fory…

功能特性

Bug 修复

其他改进

新贡献者

完整变更日志: github.com/apache/fory…