跳到主要内容

Fory v0.17.0 发布

· 阅读需 13 分钟
杨朝坤

Apache Fory 团队很高兴宣布 0.17.0 版本正式发布。这是一个重要版本,包含来自 19 位贡献者的 71 个 PR。请访问 Install 页面 获取各平台安装方式。

JavaScript/NodeJS Serialization:首次发布

Apache Fory 0.17.0 首次正式提供 JavaScript/NodeJS 文档、基准测试覆盖,以及对 TypeScript 友好的 IDL 代码生成支持。JavaScript 运行时面向现代 Node.js 服务和 TypeScript 代码库构建,同时保留了 Fory 的跨语言对象模型、Schema 驱动 API,以及可选的引用跟踪能力。

关键能力:

  • 面向 Node.js 中 JavaScript 和 TypeScript 对象的高性能序列化
  • 支持与 Java、Python、Go、Rust、C#、Swift 和 Dart 的跨语言兼容
  • 通过 Type.* builder 与 TypeScript decorator 提供 Schema 驱动 API
  • 可选的引用跟踪,用于处理共享引用和循环引用对象图
  • 用于 Schema 演进的兼容模式
  • 可配置的深度、二进制大小和集合大小护栏
  • 在 Fory IDL/compiler 工作流中支持 JavaScript/TypeScript target
  • 为 Node.js 20+ 提供可选的 @apache-fory/hps 快速字符串路径

快速开始

import Fory, { Type } from "@apache-fory/core";

const userType = Type.struct(
{ typeName: "example.user" },
{
id: Type.int64(),
name: Type.string(),
age: Type.int32(),
},
);

const fory = new Fory();
const { serialize, deserialize } = fory.register(userType);

const bytes = serialize({
id: 1n,
name: "Alice",
age: 30,
});

const user = deserialize(bytes);
console.log(user);

JavaScript 基准测试

以下是代表性数据结构上的吞吐结果(ops/sec,越高越好),用于比较 Fory、Protocol Buffers 与 JSON。

DatatypeOperationFory TPSProtobuf TPSJSON TPSFastest
StructSerialize8,453,9501,903,7063,058,232fory
StructDeserialize9,705,2878,233,6643,860,538fory
SampleSerialize1,498,391422,620744,790fory
SampleDeserialize1,918,162819,010762,048fory
MediaContentSerialize1,293,157729,4971,299,908json
MediaContentDeserialize1,638,0861,209,140921,191fory
StructListSerialize3,928,325495,648891,810fory
StructListDeserialize3,264,8271,529,744986,144fory
SampleListSerialize355,58192,741163,120fory
SampleListDeserialize424,916163,253162,520fory
MediaContentListSerialize286,053148,977282,445fory
MediaContentListDeserialize376,826244,622190,155fory

序列化数据大小(bytes):

DatatypeForyProtobufJSON
Struct5861103
Sample446377724
MediaContent391307596
StructList184315537
SampleList198019003642
MediaContentList166515503009

详细基准数据请参见: https://github.com/apache/fory/tree/v0.17.0/benchmarks/javascript

Dart Serialization:首次发布

Apache Fory 0.17.0 也正式带来了 Dart serialization 的首次发布,提供官方文档、基准测试覆盖、重构后的运行时,以及 Dart IDL 支持。Dart 实现重点关注生成式 serializer、稳定的跨语言类型标识、Schema 演进,以及面向服务工作负载的可预测 API。

关键能力:

  • 使用生成代码而非反射实现高性能 Dart serialization
  • 支持与 Java、Python、Go、Rust、C#、Swift 和 JavaScript 的跨语言兼容
  • 提供 @ForyStruct@ForyField 注解,并结合 build_runner 进行代码生成
  • 用于跨版本 Schema 演进的兼容模式
  • 可选的引用跟踪,用于处理共享引用和循环引用对象图
  • 为高级或自定义类型提供手动 Serializer<T> 扩展点
  • 在 Fory IDL/compiler 工作流中支持 Dart target

快速开始

import 'package:fory/fory.dart';

part 'person.fory.dart';

enum Color {
red,
blue,
}

@ForyStruct()
class Person {
Person();

String name = '';
Int32 age = Int32(0);
Color favoriteColor = Color.red;
}

void main() {
final fory = Fory();
PersonFory.register(
fory,
Color,
namespace: 'example',
typeName: 'Color',
);
PersonFory.register(
fory,
Person,
namespace: 'example',
typeName: 'Person',
);

final bytes = fory.serialize(Person()
..name = 'Ada'
..age = Int32(36)
..favoriteColor = Color.blue);
final roundTrip = fory.deserialize<Person>(bytes);
print(roundTrip.name);
}

Dart 基准测试

以下是代表性数据结构上的吞吐结果(ops/sec,越高越好),用于比较 Fory 与 Protocol Buffers。

DatatypeOperationFory TPSProtobuf TPSFastest
StructSerialize3,989,4321,884,653fory (2.12x)
StructDeserialize5,828,1974,199,680fory (1.39x)
SampleSerialize1,649,722500,167fory (3.30x)
SampleDeserialize2,060,113785,109fory (2.62x)
MediaContentSerialize800,876391,235fory (2.05x)
MediaContentDeserialize1,315,115683,533fory (1.92x)
StructListSerialize1,456,396367,506fory (3.96x)
StructListDeserialize1,921,006645,958fory (2.97x)
SampleListSerialize411,14448,508fory (8.48x)
SampleListDeserialize464,273103,558fory (4.48x)
MediaContentListSerialize186,87077,029fory (2.43x)
MediaContentListDeserialize330,293128,215fory (2.58x)

序列化数据大小(bytes):

DatatypeForyProtobuf
Struct5861
Sample446377
MediaContent365307
StructList184315
SampleList19801900
MediaContentList15351550

详细基准数据请参见: https://github.com/apache/fory/tree/v0.17.0/benchmarks/dart

发布亮点

功能特性

Bug 修复

其他改进

新贡献者

完整更新日志: https://github.com/apache/fory/compare/v0.16.0...v0.17.0