#data #schema #kiwi #binary-format #helper #routines #read

kiwi-schema

这是一个Rust库,提供了一些用于解析Kiwi序列化格式的文件的帮助函数。

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 编码

MIT 许可证

75KB
1.5K SLoC

Kiwi消息格式

Kiwi是一种基于模式的二进制格式,用于高效地编码数据树。它受到谷歌的Protocol Buffer格式的启发,但更简单,编码更紧凑,并且对可选字段的支撑更好。

目标

  • 高效编码常见值:对数值使用变长编码,其中小值占用的空间更少。
  • 高效编码复合对象:结构体功能支持嵌套对象,无需编码开销。
  • 可选字段的存在可检测:这在Protocol Buffers中是不可能的,尤其是对于重复字段。
  • 线性可序列化:读取和写入都是单扫描操作,因此它们缓存效率高,并具有保证的时间复杂度。
  • 向后兼容性:新版本的方案仍可以读取旧数据。
  • 向前兼容性:如果与数据捆绑了新方案副本(新方案允许解码器跳过未知字段),则旧版本的方案可以可选地读取新数据。
  • 简单实现:API非常简单,生成的C++代码仅依赖于一个文件。

非目标

  • 最优位打包:如果需要,编码后可以使用压缩以获得更多的空间节省。

原生类型

  • bool:存储truefalse的值。将使用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/

使用示例

选择一种语言

无运行时依赖