#codec #messagepack #serialization #decoding #deserialize #no-std

no-std msgpackin

Msgpackin 纯 Rust MessagePack 编码/解码库

4 个版本

0.0.4 2023年8月31日
0.0.3 2022年2月15日
0.0.2 2022年2月15日
0.0.1 2022年2月15日

#389编码

每月25次下载

Apache-2.0

185KB
5K SLoC

msgpackin

Msgpackin 纯 Rust MessagePack 编码/解码库。

Msgpackin 支持 no_std,但需要 alloc crate。如果您需要无 alloc 支持,请查看 msgpackin_core crate。

Msgpackin 支持在 no_stdstd 模式下使用 serde。如果您想使用 std 模式,您还必须启用 serde_std 功能,作为弱依赖特性稳定前的临时解决方案。

路线图

  • 无 serde 的值/值引用编码和解码
  • 使用 from_ref 进行零拷贝字符串/二进制/扩展数据
  • no_std serde 支持
  • std::io::{Read, Write}std 模式下的支持
  • 通过 futures-iotokio 功能支持异步 IO
  • 递归深度检查(当前配置为占位符)
  • 为管理编码/解码扩展类型(例如时间戳(-1)的钩子
  • 基准测试/优化

功能

  • std - 默认启用,引入 Rust std 库,通过 std::io::{Read, Write} 特性进行编码和解码
  • serde - 通过 serde crate 启用序列化/反序列化
  • futures-io - 通过 futures io::{AsyncRead, AsyncWrite} 特性启用异步编码和解码
  • tokio - 启用通过 tokio io::{AsyncRead, AsyncWrite} 特性进行异步编码和解码

no_std 示例

use msgpackin::*;
let expect = Value::Map(vec![
    ("nil".into(), ().into()),
    ("bool".into(), true.into()),
    ("int".into(), (-42_i8).into()),
    ("bigInt".into(), u64::MAX.into()),
    ("float".into(), 3.141592653589793_f64.into()),
    ("str".into(), "hello".into()),
    ("ext".into(), Value::Ext(-42, b"ext-data".to_vec().into())),
    ("arr".into(), Value::Arr(vec!["one".into(), "two".into()])),
]);
let encoded = expect.to_bytes().unwrap();
let decoded = ValueRef::from_ref(&encoded).unwrap();
assert_eq!(expect, decoded);

std 示例

use msgpackin::*;
let expect = Value::Map(vec![("foo".into(), "bar".into())]);
let mut buf = Vec::new();

{
    let writer: Box<dyn std::io::Write> = Box::new(&mut buf);
    expect.to_sync(writer).unwrap();
}

let reader: Box<dyn std::io::Read> = Box::new(buf.as_slice());
let decoded = Value::from_sync(reader).unwrap();
assert_eq!(expect, decoded);

异步示例

use msgpackin::*;
let expect = Value::Map(vec![("foo".into(), "bar".into())]);
let mut buf = Vec::new();

{
    let writer: Box<dyn tokio::io::AsyncWrite + Unpin> = Box::new(&mut buf);
    futures::executor::block_on(async { expect.to_async(writer).await })
        .unwrap();
}

let reader: Box<dyn tokio::io::AsyncRead + Unpin> =
    Box::new(buf.as_slice());
let decoded =
    futures::executor::block_on(async { Value::from_async(reader).await })
        .unwrap();
assert_eq!(expect, decoded);

serde 示例

use msgpackin::*;
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
struct X {
    pub nil: (),
    pub bool_: bool,
    pub int: i8,
    pub big_int: u64,
    pub float: f64,
    pub str_: String,
    pub arr: Vec<String>,
}

let expect = X {
    nil: (),
    bool_: true,
    int: -42,
    big_int: u64::MAX,
    float: 3.141592653589793,
    str_: "hello".into(),
    arr: vec!["one".into(), "two".into()],
};

let encoded = to_bytes(&expect).unwrap();
let decoded: X = from_sync(encoded.as_slice()).unwrap();
assert_eq!(expect, decoded);

许可协议:Apache-2.0

依赖项

~0–1.3MB
~24K SLoC