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
每月下载量383
在 5 crates中使用
50KB
1K SLoC
Desse
为编译时已知大小的类型提供高效的二进制序列化和反序列化。这个crate不能用于序列化或反序列化动态分配的类型,例如,String
,Vec
,HashMap
等,以及编译时大小未知的类型,如slices
,&str
等。
二进制编码方案
此crate使用最小二进制编码方案,使得编码对象的大小将小于(在Rust添加对齐填充字节的情况下)或等于它在运行Rust程序中的大小。例如,考虑以下struct
struct MyStruct {
a: u8,
b: u16,
}
Desse::serialize
将使用以下格式序列化此结构体:[u8; 3]
,其中3
是u8
和u16
大小的总和。
用法
将desse
添加到Cargo.toml
的dependencies
部分。
[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::serialize
和Desse::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 更重视性能而非其他。如果使用经过测试和验证的 不安全 代码能提高性能,我们不会回避使用它。
基准测试
以下是比较 desse
和 bincode
序列化和反序列化相同 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,而
desse
为 1.6326 ns。反序列化的结果也类似,其中
bincode
为 22.094 ns,而
desse
为 1.6101 ns。
您可以通过运行以下命令来运行基准测试
cargo bench
未来改进
一旦 const_generics
在 Rust 中得到实现,我们可以为许多类型提供默认实现,例如,impl Desse for [T; n] where T: Desse
,以及 Rust 中的其他可变大小静态分配类型。
许可证
根据您的选择,许可如下
- Apache License,版本 2.0 (http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义,您有意提交给作品包含的贡献将按照上述方式双许可,不附加任何额外的条款或条件。
依赖项
~0–285KB