#messagepack #protocols #derive #macro #msgpacker #msg-packer

msgpacker-derive

为Rust的MessagePack协议实现提供的派生宏

6个版本

0.3.1 2023年6月9日
0.3.0 2023年6月9日
0.2.0 2023年6月7日
0.1.2 2022年7月31日

#29#msgpack

Download history 194/week @ 2024-03-13 233/week @ 2024-03-20 167/week @ 2024-03-27 129/week @ 2024-04-03 146/week @ 2024-04-10 111/week @ 2024-04-17 138/week @ 2024-04-24 134/week @ 2024-05-01 117/week @ 2024-05-08 132/week @ 2024-05-15 126/week @ 2024-05-22 134/week @ 2024-05-29 111/week @ 2024-06-05 134/week @ 2024-06-12 173/week @ 2024-06-19 126/week @ 2024-06-26

548 每月下载量
16 个crate中使用 (直接使用 2 个)

MIT/Apache

25KB
502 代码行

MessagePacker - 一个无标准库的msgpack实现

crates.io Documentation License

协议规范可以在这里找到。

这个crate旨在简单和性能。不使用任何依赖项,只使用标准Rust库。

它将为Rust原子类型实现 PackableUnpackable 特性。这些特性也可以手动实现。

特性

  • alloc: 为 VecString 实现功能,并解锁自定义扩展。
  • derive: 启用 MsgPacker 派生便利宏。
  • strict: 如果缓冲区大小的协议违规,将触发panic;允许的最大大小是 u32::MAX
  • std: 为 std 集合实现 PackableUnpackable

示例

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 高出 ~10x 的性能。

打包1,000个元素

image image

解包1,000个元素

image image

依赖关系

~290–740KB
~18K SLoC