13个版本
使用旧的Rust 2015
0.2.1 | 2023年9月3日 |
---|---|
0.2.0 | 2023年8月11日 |
0.1.2 | 2020年6月4日 |
0.1.1 | 2018年9月26日 |
0.0.4 | 2018年1月31日 |
#413 in 编码
75KB
1.5K SLoC
Kiwi消息格式
Kiwi是一种基于模式的二进制格式,用于高效地编码数据树。它受到谷歌的Protocol Buffer格式的启发,但更简单,编码更紧凑,并且对可选字段的支撑更好。
目标
- 高效编码常见值:对数值使用变长编码,其中小值占用的空间更少。
- 高效编码复合对象:结构体功能支持嵌套对象,无需编码开销。
- 可选字段的存在可检测:这在Protocol Buffers中是不可能的,尤其是对于重复字段。
- 线性可序列化:读取和写入都是单扫描操作,因此它们缓存效率高,并具有保证的时间复杂度。
- 向后兼容性:新版本的方案仍可以读取旧数据。
- 向前兼容性:如果与数据捆绑了新方案副本(新方案允许解码器跳过未知字段),则旧版本的方案可以可选地读取新数据。
- 简单实现:API非常简单,生成的C++代码仅依赖于一个文件。
非目标
- 最优位打包:如果需要,编码后可以使用压缩以获得更多的空间节省。
原生类型
- bool:存储
true
或false
的值。将使用1字节。 - byte:一个无符号8位整数值。显然使用1字节。
- int:使用变长编码存储的32位整数值,该编码针对存储小数值进行了优化。将使用最多5字节。
- uint:使用变长编码存储的32位整数值,该编码针对存储小非负数进行了优化。将使用最多5字节。
- 浮点数: 一个32位的浮点数。通常使用4个字节,但零值使用1个字节(当编码时,非规格数变为零)。
- 字符串: 一个UTF-8空终止字符串。至少使用1个字节。
- int64: 使用可变长度编码存储的64位整数值,该编码优化存储小数值。最多使用9个字节。
- uint64: 使用可变长度编码存储的64位整数值,该编码优化存储小的非负数。最多使用9个字节。
- T[]: 任何类型都可以使用
[]
后缀转换为数组。
用户类型
- 枚举: 一个具有受限制值的
uint
,这些值通过名称标识。可以在不破坏向后兼容性的情况下向任何消息添加新字段。 - 结构体: 一个具有固定字段集合的复合值,这些字段始终是必需的,并且按照顺序写入。一旦结构体开始使用,就不能向其中添加新字段。
- 消息: 一个具有可选字段的复合值。可以在不破坏向后兼容性的情况下向任何消息添加新字段。
示例模式
enum Type {
FLAT = 0;
ROUND = 1;
POINTED = 2;
}
struct Color {
byte red;
byte green;
byte blue;
byte alpha;
}
message Example {
uint clientID = 1;
Type type = 2;
Color[] colors = 3;
}
实时演示
有关模式编译器的实时演示,请参阅http://evanw.github.io/kiwi/。
使用示例
选择一种语言