Xlang 序列化格式
跨语言序列化规范
本文定义 Apache Fory xlang 二进 制协议的通用线格式,适用于多语言互操作场景。
目标:
- 二进制布局跨语言稳定
- 支持引用跟踪、类型元信息和 schema 演进
- 在流式序列化中支持增量写入共享元信息
类型系统
数据类型
xlang 类型分为:
- 基础类型:bool、整数、浮点、string、binary
- 容器类型:list、set、map、array
- 结构类型:enum、struct、union、ext
- 时间类型:duration、timestamp、date
Polymorphisms
协议支持多态对象。解码端可依据 type meta 判断运行时真实类型,并选择对应 serializer。
Type disambiguation
当某语言类型可映射到多个 Fory 类型(如 fixed/varint/tagged 整数)时,必须通过字段元信息或类型注解消歧。
Type ID
类型由 internal_type_id 与(可选)user_type_id 共同表达:
- 内建类型通常直接由 internal ID 唯一表示
- 用户类型通 过 internal kind + user ID(或命名类型)表示
Internal Type ID Table
核心 internal IDs(示例):
| ID | 类型 |
|---|---|
| 1 | bool |
| 2-20 | 各类数字类型 |
| 21 | string |
| 22 | list |
| 23 | set |
| 24 | map |
| 25 | enum |
| 27 | struct |
| 28 | compatible_struct |
| 31 | ext |
| 33 | union |
| 36 | none |
| 37 | duration |
| 38 | timestamp |
| 39 | date |
| 40+ | decimal/binary/array 等 |
完整映射见 Xlang 类型映射。
Type ID Encoding for User Types
用户类型采用拆分编码:
- 先写 internal type ID(8-bit kind)
- 再写
user_type_id(varuint32)
不做 bit packing,便于实现与调试。
Type mapping
跨语言类型映射总表见 xlang_type_mapping.md。