16个版本
0.4.3 | 2023年6月11日 |
---|---|
0.4.2 | 2023年6月9日 |
0.3.1 | 2022年8月16日 |
0.2.2 | 2022年7月31日 |
0.1.7 | 2021年10月24日 |
447 在 编码 中排名
每月472次下载
在 17 个crate中使用 (直接使用3个)
83KB
2.5K SLoC
MessagePacker - 一个no-std msgpack实现
协议规范可以在 这里 找到。
此crate旨在简单和性能。不使用任何依赖项,仅使用标准Rust库。
它将为Rust原子类型实现 Packable
和 Unpackable
特性。这些特性也可以手动实现。
功能
- alloc:为
Vec
、String
实现功能,并解锁自定义扩展。 - derive:启用
MsgPacker
derive便捷宏。 - strict:如果缓冲区大小违反协议,则会panic;允许的最大大小为
u32::MAX
。 - std:将为
std
集合实现Packable
和Unpackable
。
示例
use msgpacker::prelude::*;
use std::collections::HashMap;
// boilerplate derives - those aren't required
#[derive(Debug, PartialEq, Eq)]
// this convenience derive macro will implement `Packable` and `Unpackable`
#[derive(MsgPacker)]
pub struct City {
name: String,
// The traits are implemented for stdlib collections. If you have a custom map, you can use the
// directive `#[msgpacker(map)]` so the traits will be automatically implemented through the
// iterators of the map.
inhabitants_per_street: HashMap<String, u64>,
// This is also automatically implemented. The manual implementation is via `#[msgpacker(array)]`.
zones: Vec<String>,
}
// create an instance of a city.
let city = City {
name: "Kuala Lumpur".to_string(),
inhabitants_per_street: HashMap::from([
("Street 1".to_string(), 10),
("Street 2".to_string(), 20),
]),
zones: vec!["Zone 1".to_string(), "Zone 2".to_string()],
};
// serialize the city into bytes
let mut buf = Vec::new();
let n = city.pack(&mut buf);
println!("serialized {} bytes", n);
// deserialize the city and assert correctness
let (n, deserialized) = City::unpack(&buf).unwrap();
println!("deserialized {} bytes", n);
assert_eq!(city, deserialized);
基准测试
使用 Intel(R) Core(TM) i9-9900X CPU @ 3.50GHz
获得的成果。
实现的简单性解锁了比 rmp-serde 速度快10倍以上的性能。
打包1,000个元素
解包1,000个元素
依赖项
~120KB