#二进制编码 #序列化 #二进制 #编译时

no-std desse

编译时已知大小的类型的高效二进制序列化和反序列化

4个版本

0.2.1 2019年4月23日
0.2.0 2019年4月23日
0.1.1 2019年4月4日
0.1.0 2019年4月2日

编码中排名1695

Download history 33/week @ 2024-03-11 34/week @ 2024-03-18 42/week @ 2024-03-25 150/week @ 2024-04-01 158/week @ 2024-04-08 72/week @ 2024-04-15 107/week @ 2024-04-22 112/week @ 2024-04-29 180/week @ 2024-05-06 98/week @ 2024-05-13 58/week @ 2024-05-20 47/week @ 2024-05-27 105/week @ 2024-06-03 102/week @ 2024-06-10 105/week @ 2024-06-17 69/week @ 2024-06-24

每月下载量383
5 crates中使用

MIT许可

50KB
1K SLoC

Desse 构建状态

为编译时已知大小的类型提供高效的二进制序列化和反序列化。这个crate不能用于序列化或反序列化动态分配的类型,例如,StringVecHashMap等,以及编译时大小未知的类型,如slices&str等。

二进制编码方案

此crate使用最小二进制编码方案,使得编码对象的大小将小于(在Rust添加对齐填充字节的情况下)或等于它在运行Rust程序中的大小。例如,考虑以下struct

struct MyStruct {
    a: u8,
    b: u16,
}

Desse::serialize将使用以下格式序列化此结构体:[u8; 3],其中3u8u16大小的总和。

用法

desse添加到Cargo.tomldependencies部分。

[dependencies]
desse = "0.2"

可以使用derive宏为任何结构体或枚举(其大小在编译时已知)实现Desse特质。此crate还提供了一个用于实现DesseSized特质的derive宏,这是实现Desse特质所必需的。

use desse::{Desse, DesseSized};

#[derive(Debug, PartialEq, Desse, DesseSized)]
struct MyStruct {
    a: u8,
    b: u16,
}

现在,您可以使用Desse::serializeDesse::deserialize_from来序列化和反序列化此结构体。

let my_struct = MyStruct { a: 5, b: 1005 };
let serialized: [u8; 3] = my_struct.serialize();
let new_struct = MyStruct::deserialize_from(&serialized);

assert_eq!(my_struct, new_struct);

请注意,Desse::serialize 返回一个固定长度的数组(在上述情况中为 3),而 Desse::deserialize 以固定长度数组的引用作为参数。

性能

此 crate 更重视性能而非其他。如果使用经过测试和验证的 不安全 代码能提高性能,我们不会回避使用它。

基准测试

以下是比较 dessebincode 序列化和反序列化相同 struct 的基准测试结果。

struct::serialize/desse::serialize
                        time:   [1.6228 ns 1.6326 ns 1.6434 ns]
                        change: [-1.1985% +0.0554% +1.2769%] (p = 0.94 > 0.05)
                        No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) high mild
  6 (6.00%) high severe

struct::serialize/bincode::serialize
                        time:   [19.991 ns 20.081 ns 20.201 ns]
                        change: [-1.0739% +0.3569% +1.7361%] (p = 0.63 > 0.05)
                        No change in performance detected.
Found 12 outliers among 100 measurements (12.00%)
  3 (3.00%) high mild
  9 (9.00%) high severe

struct::deserialize/desse::deserialize
                        time:   [1.6063 ns 1.6101 ns 1.6144 ns]
                        change: [-1.3079% -0.1278% +1.0394%] (p = 0.84 > 0.05)
                        No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
  1 (1.00%) high mild
  6 (6.00%) high severe

struct::deserialize/bincode::deserialize
                        time:   [22.004 ns 22.094 ns 22.209 ns]
                        change: [-1.1573% +0.0698% +1.3631%] (p = 0.92 > 0.05)
                        No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
  3 (3.00%) high mild
  6 (6.00%) high severe

从上述基准测试中可以看出,bincode 序列化的平均时间为 20.081 ns,而 desse1.6326 ns。反序列化的结果也类似,其中 bincode22.094 ns,而 desse1.6101 ns

您可以通过运行以下命令来运行基准测试

cargo bench

未来改进

一旦 const_generics 在 Rust 中得到实现,我们可以为许多类型提供默认实现,例如,impl Desse for [T; n] where T: Desse,以及 Rust 中的其他可变大小静态分配类型。

许可证

根据您的选择,许可如下

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您有意提交给作品包含的贡献将按照上述方式双许可,不附加任何额外的条款或条件。

依赖项

~0–285KB