跳到主要内容
版本:dev

配置

本页说明 Fory 构造函数选项。

创建 Fory 实例

将选项直接传给构造函数:

import 'package:fory/fory.dart';

// defaults: xlang wire format with compatible schema evolution
final fory = Fory();

// customize limits while keeping default compatible mode
final fory = Fory(
maxDepth: 512,
maxTypeFields: 512,
maxTypeMetaBytes: 4096,
maxSchemaVersionsPerType: 10,
maxAverageSchemaVersionsPerType: 3,
maxGraphMemoryBytes: 64 * 1024 * 1024,
maxUnbackedContainerItems: 8192,
);

每个应用创建并复用一个实例;每个请求都创建新的 Fory 没有任何好处。

选项

compatible

兼容模式默认启用。当服务需要处理同一模型不同版本的载荷时,请保持启用,例如滚动部署或客户端与服务端版本不一致期间。

compatible: true 时:

  • 一端新增或删除字段不会破坏另一端。
  • 通信方仍必须使用相同 name(或数字 id)标识类型。

compatible: false 时:

  • 双方必须具有完全相同的 Schema。仅当每个读取端和写入端始终使用该 Schema,并且希望获得更快序列化和更小体积时,才使用此设置。对于跨语言载荷,只有确认每种语言使用相同 Schema,或原生类型由 Fory Schema IDL 生成时,才设置 compatible: false
final fory = Fory(compatible: false);

checkStructVersion

仅在 compatible: false 时相关。当设为 true 时,Fory 会验证载荷中的 Schema 版本是否与接收端已知版本匹配,从而发现有意使用相同 Schema 的载荷中的意外不匹配。

final fory = Fory(
compatible: false,
checkStructVersion: true, // default
);

compatible: true 时,此选项无效。

maxDepth

限制对象图的嵌套深度。数据确实包含深层树时提高此值;降低此值可以快速拒绝深度超出预期的载荷。

final fory = Fory(maxDepth: 128);

远程 Schema 元数据限制

兼容模式可以接收用于 Schema 演进的远程元数据。以下限制约束元数据大小和允许的 Schema 版本数:

final fory = Fory(
maxTypeFields: 512,
maxTypeMetaBytes: 4096,
maxSchemaVersionsPerType: 10,
maxAverageSchemaVersionsPerType: 3,
);
  • maxTypeFields 限制单个已接收 struct 元数据主体中的字段数。
  • maxTypeMetaBytes 限制单个已接收 TypeMeta 主体中的编码主体字节数,不包括 8 字节头部和任何扩展大小 varint。
  • maxSchemaVersionsPerType 限制单个逻辑类型允许的远程元数据版本数。
  • maxAverageSchemaVersionsPerType 限制所有已接受远程类型的平均值。有效的全局下限为 8192 个 Schema。

maxGraphMemoryBytes

设置单次根值反序列化的近似对象图内存限制。该估算主要覆盖物化的 list、set、map、array、struct 和 object。它会跳过 string、binary data、primitive scalar 和 dense typed-array 载荷等叶子值,因此实际进程内存可能高于此值。叶子值仍受可用字节检查保护:如果未读输入不包含足够字节,Fory 不会读取或创建该叶子值。

默认值固定为 128 MiB,不会根据输入大小推导。

当可信工作负载确实需要更大或更小的 collection/map/struct 限制时,请设置正值:

final fory = Fory(maxGraphMemoryBytes: 256 * 1024 * 1024);

创建运行时时会拒绝显式的非正值。

maxUnbackedContainerItems

限制一次根值反序列化中,重复读取主体不按比例消费输入的集合元素和 map 条目。默认值为 8192;零表示严格限制。

final fory = Fory(maxUnbackedContainerItems: 8192);

默认值

选项默认值
compatibletrue
checkStructVersionfalse
maxDepth256
maxTypeFields512
maxTypeMetaBytes4096
maxSchemaVersionsPerType10
maxAverageSchemaVersionsPerType3
maxGraphMemoryBytes134217728
maxUnbackedContainerItems8192

跨语言说明

使用 Fory 在不同语言编写的服务之间通信时:

  • 如果任意一端需要 Schema 演进,请在所有端保持启用兼容模式。
  • 所有端使用相同数字 ID 或 name 值。
  • 写入端和读取端的 compatible 设置必须匹配;模式不匹配会失败。

安全

有关信任边界、安全的读取端配置和验证方法,请参阅 Dart 安全

相关主题