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次下载
185KB
5K SLoC
msgpackin
Msgpackin 纯 Rust MessagePack 编码/解码库。
Msgpackin 支持 no_std
,但需要 alloc
crate。如果您需要无 alloc 支持,请查看 msgpackin_core
crate。
Msgpackin 支持在 no_std
或 std
模式下使用 serde
。如果您想使用 std
模式,您还必须启用 serde_std
功能,作为弱依赖特性稳定前的临时解决方案。
路线图
- 无 serde 的值/值引用编码和解码
- 使用
from_ref
进行零拷贝字符串/二进制/扩展数据 -
no_std
serde 支持 -
std::io::{Read, Write}
在std
模式下的支持 - 通过
futures-io
或tokio
功能支持异步 IO - 递归深度检查(当前配置为占位符)
- 为管理编码/解码扩展类型(例如时间戳(
-1
)的钩子 - 基准测试/优化
功能
std
- 默认启用,引入 Rust std 库,通过std::io::{Read, Write}
特性进行编码和解码serde
- 通过serde
crate 启用序列化/反序列化futures-io
- 通过 futuresio::{AsyncRead, AsyncWrite}
特性启用异步编码和解码tokio
- 启用通过 tokioio::{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