2个版本 (1个稳定版)
使用旧的Rust 2015
1.0.0 | 2017年5月13日 |
---|---|
0.0.1 | 2017年1月4日 |
913在编码类别中的排名
每月下载量12,390
用于32个crate (10个直接使用)
29KB
646 行
ssmarshal
ssmarshal ("愚蠢的简单编码") 是一个基于serde的反序列化库。它与 bincode 类似,但不支持String/Vec - 这个库是完全零分配的,用于在极其有限的 no_std
环境中。关键的不变性是任何类型的值的编码空间都满足 <= size_of::<T>()
。这允许轻松地推理有限的缓冲区大小,以及需要多少才是足够的。
限制
以下类型的支持
- 任何非核心类型(例如,
Vec
,HashMap
) - 切片
- 字符串
- 包含引用或指针的类型
- 具有超过256个变体的枚举
所有枚举都必须是带有 #[repr(C)]
的,以便保持大小不变性。请注意,这排除了使用 #[repr(C)]
的枚举,但您应该彻底测试(我推荐quickcheck,参见 测试 中的示例)反序列化该类型的值,以确保该类型保持大小不变性。
格式的详细信息
格式不是特别紧凑,但不会添加额外的冗余,并且编码/解码速度很快。
bool
被序列化为一个字节,如果为真则为 1,如果为假则为 0。- 整数类型以小端形式编码。
- f32 被位转换为一个 u32 然后作为 u32 编码。同样,f64 和 u64。
- 已居住的枚举将选择器序列化为1字节,然后是字段。
- 结构体仅序列化其字段。
- 单元类型和未居住的枚举根本不序列化。
- 元组按顺序序列化字段。
没有填充。
如您所见,此格式没有自描述性。要成功反序列化值,必须事先知道确切的布局。
替代方案
此设计用于在微内核中执行IPC,具有稳定的ABI,不保存到磁盘或通过网络传输。虽然可能有用,但您可能需要一个可以处理数据演化的格式,例如Cap'n Proto。
如果您真的关心最小化编码空间,您可能需要查看ASN.1 PER。
如果您需要更多功能(例如,切片或引用),但仍然不关心数据演化,我建议使用bincode。
测试
roundtrip
测试套件几乎锻炼了 ssmarshal 的所有功能,覆盖率超过95%(缺失的大多数是无效/不受支持的类型的一些错误情况)。
在每次发布之前,该库都使用 cargo-fuzz
(libFuzzer)进行广泛的模糊测试。有关使用的脚本的详细信息,请参阅 fuzz
目录。
依赖关系
~255–500KB