#marshalling #format #serde #stupid #type #value #value-only

no-std ssmarshal

使用serde进行简单的值编码

2个版本 (1个稳定版)

使用旧的Rust 2015

1.0.0 2017年5月13日
0.0.1 2017年1月4日

913编码类别中的排名

Download history 3385/week @ 2024-02-28 3633/week @ 2024-03-06 3344/week @ 2024-03-13 4239/week @ 2024-03-20 4585/week @ 2024-03-27 4065/week @ 2024-04-03 3998/week @ 2024-04-10 2981/week @ 2024-04-17 2708/week @ 2024-04-24 3535/week @ 2024-05-01 3450/week @ 2024-05-08 2583/week @ 2024-05-15 3002/week @ 2024-05-22 3792/week @ 2024-05-29 2378/week @ 2024-06-05 2576/week @ 2024-06-12

每月下载量12,390
用于32个crate (10个直接使用)

MIT/Apache

29KB
646

ssmarshal

Crates.io

文档

ssmarshal ("愚蠢的简单编码") 是一个基于serde的反序列化库。它与 bincode 类似,但不支持String/Vec - 这个库是完全零分配的,用于在极其有限的 no_std 环境中。关键的不变性是任何类型的值的编码空间都满足 <= size_of::<T>()。这允许轻松地推理有限的缓冲区大小,以及需要多少才是足够的。

限制

以下类型的支持

  • 任何非核心类型(例如,VecHashMap
  • 切片
  • 字符串
  • 包含引用或指针的类型
  • 具有超过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