字段配置
本页说明如何在 Python 中配置序列化字段级元信息。
概述
Apache ForyTM 通过以下机制提供字段级配置:
pyfory.field():配置字段元信息(id、nullable、ref、ignore、dynamic)- 类型注解:控制整数编码(varint、fixed、tagged)
Optional[T]:标记字段可空
这些能力可用于:
- Tag ID:分配紧凑数值 ID,降低 struct 字段元信息开销
- 可空控制:声明 字段是否可为 null/None
- 引用跟踪:为共享对象启用引用跟踪
- 字段跳过:从序列化中排除字段
- 编码控制:指定整数编码方式(varint、fixed、tagged)
- 多态控制:控制 struct 字段是否写入类型信息
基本语法
结合 @dataclass、类型注解与 pyfory.field():
from dataclasses import dataclass
from typing import Optional
import pyfory
@dataclass
class Person:
name: str = pyfory.field(id=0)
age: pyfory.int32 = pyfory.field(id=1, default=0)
nickname: Optional[str] = pyfory.field(id=2, nullable=True, default=None)
pyfory.field() 函数
使用 pyfory.field() 配置字段级元信息:
@dataclass
class User:
id: pyfory.int64 = pyfory.field(id=0, default=0)
name: str = pyfory.field(id=1, default="")
email: Optional[str] = pyfory.field(id=2, nullable=True, default=None)
friends: List["User"] = pyfory.field(id=3, ref=True, default_factory=list)
_cache: dict = pyfory.field(ignore=True, default_factory=dict)
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | int | -1 | 字段 tag ID(-1 表示使用字段名) |
nullable | bool | False | 字段是否可为 null/None |
ref | bool | False | 是 否启用引用跟踪 |
ignore | bool | False | 是否从序列化中排除 |
dynamic | bool | None | 控制是否写入类型信息 |
default | Any | MISSING | 字段默认值 |
default_factory | Callable | MISSING | 默认值工厂函数 |
字段 ID(id)
通过给字段分配数值 ID,可减少 struct 字段元信息开销:
@dataclass
class User:
id: pyfory.int64 = pyfory.field(id=0, default=0)
name: str = pyfory.field(id=1, default="")
age: pyfory.int32 = pyfory.field(id=2, default=0)
收益:
- 序列化体积更小(元信息中数值 ID 替代字段名)
- struct 字段元信息开销更低
- 字段重命名时可保持二进制兼容
建议: 兼容模式下建议配置字段 ID,以降低序列化成本。
注意:
- 同一类内 ID 必须唯一
- ID 必须
>= 0(-1表示使用字段名编码,默认行为) - 未指定时会使用字段名写入元信息(开销更大)
不配置字段 ID(元信息使用字段名)示例:
@dataclass
class User:
id: pyfory.int64 = 0
name: str = ""
可空字段(nullable)
对可能为 None 的字段使用 nullable=True:
from typing import Optional
@dataclass
class Record:
# 可空字符串字段
optional_name: Optional[str] = pyfory.field(id=0, nullable=True, default=None)
# 可空整数字段
optional_count: Optional[pyfory.int32] = pyfory.field(id=1, nullable=True, default=None)
注意:
Optional[T]字段应配合nullable=True- 非 Optional 字段默认
nullable=False