afastdata
English | 中文
高性能 Rust 二进制序列化/反序列化框架,通过 derive 宏为自定义类型自动生成序列化代码。
特性
- 零配置派生宏 —
#[derive(AFastSerialize, AFastDeserialize)] - 丰富的类型支持 — 基本类型、
String、Vec<T>、Option<T>、[T; N]、Box<T>、元组、HashMap、HashSet、BTreeMap、BTreeSet、嵌套结构体、枚举 - 泛型支持 — 自动为泛型参数添加 trait 约束
- 可配置长度前缀 — 默认
u32(最大 4GB),可通过 feature 切换为u64 - 可配置枚举标签 — 默认
u8,可通过 feature 切换为u16或u32 - 可配置元组支持 — 默认支持最多 16 个元素,可通过 feature 切换为 8 或 32
- 统一小端序 — 所有多字节数据使用 little-endian 编码
- 零外部依赖 — 运行时无第三方依赖
快速开始
安装
在 Cargo.toml 中添加依赖:
[]
= "0.0.6"
如需 u64 长度前缀或自定义枚举标签类型:
[]
= { = "0.0.6", = ["len-u64", "tag-u16"] }
基本用法
use ;
枚举示例
use ;
泛型结构体
use ;
数据校验
通过 #[afast(...)] 属性,为结构体字段和枚举变体字段添加校验规则。
结构体校验示例
use ;
枚举变体校验示例
校验规则同样适用于枚举的命名字段变体和元组变体:
use ;
校验规则
校验规则适用于结构体字段和枚举变体字段(命名字段和元组变体):
skiporskip(default):跳过此字段的序列化和反序列化,并使用默认值(调用传入的 default 函数或者给字段类型实现 Default trait)gt(value, code, message):字段值必须大于value(支持整数和浮点数),否则返回ValidateError。适用于数值类型和Option<数值类型>(None视为通过)gte(value, code, message):字段值必须大于等于value,否则返回ValidateError。适用于数值类型和Option<数值类型>lt(value, code, message):字段值必须小于value,否则返回ValidateError。适用于数值类型和Option<数值类型>lte(value, code, message):字段值必须小于等于value,否则返回ValidateError。适用于数值类型和Option<数值类型>len(min, max, code, message):字段长度必须在min和max之间(包含两端),适用于String、Vec<T>、[T; N]、Option<T>包裹的上述类型(None视为通过)。min或max传-1表示不限制该边界,例如len(3, -1, ...)表示最小长度 3,无最大限制of([v1, v2, ...], code, message):字段值必须在[v1, v2, ...]列表中,否则返回ValidateErrorfunc(name):调用外部函数name进行校验,函数签名为fn(value: &T, field: &str) -> Result<(), ValidateError>,返回Ok(())则校验通过,否则返回ValidateError
类型检查:校验规则在编译期检查字段类型兼容性。例如
gt/gte/lt/lte只能用于数值类型或Option<数值类型>,len只能用于字符串和集合类型。不兼容的组合会产生编译错误。
支持的类型
| 类型 | 序列化方式 | 字节数 |
|---|---|---|
i8, u8 |
little-endian | 1 |
i16, u16 |
little-endian | 2 |
i32, u32 |
little-endian | 4 |
i64, u64 |
little-endian | 8 |
usize |
u64 little-endian(跨平台兼容) | 8 |
i128, u128 |
little-endian | 16 |
f32 |
IEEE 754 little-endian | 4 |
f64 |
IEEE 754 little-endian | 8 |
bool |
0x00=false, 0x01=true |
1 |
String |
LenInt 长度前缀 + UTF-8 字节 | 变长 |
&str |
LenInt 长度前缀 + UTF-8 字节(仅序列化) | 变长 |
Vec<T> |
LenInt 元素个数 + 逐元素编码 | 变长 |
Option<T> |
1 字节标记 + 数据(仅 Some) | 变长 |
[T; N] |
逐元素编码,无长度前缀 | 固定 |
(A, B, ...) |
逐元素编码,无长度前缀 | 固定/变长 |
Box<T> |
与 T 相同 |
与 T 相同 |
HashMap<K, V> |
LenInt 键值对数 + 逐对编码 | 变长 |
HashSet<T> |
LenInt 元素个数 + 逐元素编码 | 变长 |
BTreeMap<K, V> |
LenInt 键值对数 + 逐对编码 | 变长 |
BTreeSet<T> |
LenInt 元素个数 + 逐元素编码 | 变长 |
| 结构体 | 逐字段编码,无额外前缀 | 变长 |
| 枚举 | Tag(u8/u16/u32) 变体索引 + 变体字段数据 | 变长 |
编码格式详解
结构体
所有字段按声明顺序依次序列化,无额外前缀:
[field1 bytes][field2 bytes][field3 bytes]...
枚举
先写入变体索引(Tag 类型,默认 u8,可通过 feature 切换为 u16 或 u32,从 0 开始按声明顺序递增),再写入变体字段数据:
[Tag variant_index][field1 bytes][field2 bytes]...
Unit 变体只写入索引,无字段数据。
长度前缀
String、Vec<T> 等变长类型使用 LenInt 作为长度前缀:
- 默认:
u32little-endian(4 字节,最大约 4GB) - 启用
len-u64feature 后:u64little-endian(8 字节)
Feature Flags
| Feature | 说明 | 默认 |
|---|---|---|
len-u64 |
将长度前缀从 u32 切换为 u64 |
否 |
tag-u8 |
枚举变体标签使用 u8(1 字节,最多 256 个变体) |
是 |
tag-u16 |
枚举变体标签使用 u16(2 字节,最多 65536 个变体) |
否 |
tag-u32 |
枚举变体标签使用 u32(4 字节,最多约 42 亿个变体) |
否 |
tuple-8 |
元组支持最多 8 个元素 | 否 |
tuple-16 |
元组支持最多 16 个元素 | 是 |
tuple-32 |
元组支持最多 32 个元素 | 否 |
项目结构
afastdata/
├── Cargo.toml # Workspace 配置
├── README.md # 中文文档(本文件)
├── README_EN.md # English documentation
├── afastdata/ # 核心库 + 统一入口 crate
│ ├── Cargo.toml # 含 `len-u64`、`tag-*`、`tuple-*` features
│ ├── src/lib.rs # trait 定义 + 基本类型实现 + re-export derive 宏
│ └── tests/
│ ├── derive_tests.rs # 派生宏集成测试
│ └── primitive_tests.rs # 基本类型序列化测试
└── afastdata-macro/ # Proc-macro 库
├── Cargo.toml
└── src/lib.rs # AFastSerialize / AFastDeserialize derive 宏
运行示例
运行测试
License
MIT