跳到主要内容
版本:dev

类型注册

Fory 需要知道序列化消息中的某个类型对应哪个类。你要做的,就是在序列化或反序列化之前注册每个类。

选择注册策略

Fory 提供两种策略。选定一种后,就要在所有读写该类型的语言里保持一致。

策略一:数字 ID

更紧凑,也更快。适合小团队在服务间统一协调 ID。

ModelsFory.register(fory, User, id: 100);

其他语言里也必须使用相同的数字:

// Java side
fory.register(User.class, 100);

策略二:Namespace + Type Name

自描述性更强。适合多个团队或多个包独立定义类型,而协调数字 ID 不现实的场景。

ModelsFory.register(
fory,
User,
namespace: 'example',
typeName: 'User',
);

每个读写该类型的运行时都必须使用相同的 namespacetypeName

不要对同一个类型混用策略。 如果一侧使用数字 ID,另一侧使用名称,反序列化会失败。

注册生成类型

调用 .fory.dart 文件中生成的 register 函数,它会为你安装好所需的全部序列化元信息:

UserModelsFory.register(fory, User, id: 100);

注册自定义序列化器

对于无法添加 @ForyStruct() 的类型,可以直接传入序列化器实例:

fory.registerSerializer(
ExternalType,
const ExternalTypeSerializer(),
namespace: 'example',
typeName: 'ExternalType',
);

关于如何实现序列化器,见 自定义序列化器

必须遵守的规则

  • 在第一次调用 serializedeserialize 之前完成注册
  • 注册消息中可能出现的每一个类,而不仅是根类型
  • 一旦载荷已经持久化,或已经在服务间交换,就必须保持 ID 或名称稳定
  • 对同一个类型,不要一侧用数字 ID,另一侧用名称

跨语言要求

所有读写该类型的运行时都必须使用相同的数字 ID,或者相同的 namespace + typeName 组合。示例见 跨语言

相关主题