#cbor #binary #serde #minicbor

no-std minicbor-ser

为 minicbor 简单实现的 serde

3 个不稳定版本

0.2.0 2022年11月28日
0.1.4 2022年11月17日
0.1.3 2022年3月16日
0.1.2 2021年11月13日

#1122编码

Download history 215/week @ 2024-03-13 346/week @ 2024-03-20 215/week @ 2024-03-27 192/week @ 2024-04-03 138/week @ 2024-04-10 173/week @ 2024-04-17 152/week @ 2024-04-24 140/week @ 2024-05-01 194/week @ 2024-05-08 197/week @ 2024-05-15 145/week @ 2024-05-22 160/week @ 2024-05-29 235/week @ 2024-06-05 109/week @ 2024-06-12 125/week @ 2024-06-19 92/week @ 2024-06-26

576 每月下载次数
31 个crate中使用(通过 wasmbus-rpc

MIT 协议

62KB
2K SLoC

minicbor-ser

crev reviews

此仓库为 serdeminicbor 提供了简单实现,使其更容易使用。

快速开始

就像使用其他 serde 衍生的库一样

[dependencies]
minicbor-ser = "0.1.*"
  • 序列化
use minicbor_ser as cbor;
use serde::Serialize;
fn main(){
    #[derive(Debug, Serialize)]
    struct TestStruct {
        hello: String,
    }

    let test_struct = TestStruct {
            hello: "world".to_string(),
    };

    let value = cbor::to_vec(&test_struct).unwrap();
    assert_eq!(
        [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64],
        value.as_slice(),
    )
}
  • 反序列化
use minicbor_ser as cbor;
use serde::Deserialize;
fn main(){
    #[derive(Debug, Deserialize, PartialEq)]
    struct TestStruct {
        hello: String,
    }

    let data = [0xA1u8, 0x65, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0x65, 0x77, 0x6F, 0x72, 0x6C, 0x64];
    
    let value: TestStruct = cbor::from_slice(&data[..]).unwrap();
    
    assert_eq!(
        TestStruct {
            hello: "world".to_string(),
        },
        value,
    );
}

默认情况下,结构体将被序列化为 map,元组将被序列化为 array。如果您不想将顶层结构体和元组包裹在 map 和数组中,可以使用 to_vec_flat。反序列化时,应使用 from_slice_flat

let expect = [0x01u8, 0x18, 0xff, 0x65, 0x68, 0x65, 0x6c, 0x6c, 0x6f];
let tuple_flatten = (0x01u8, 0xffu8, "hello");
let value = to_vec_flat(&tuple_flatten).unwrap();
assert_eq!(
    expet,
    value.as_slice(),
)

let data = crate::to_vec_flat(&exp).unwrap();
let value = from_slice_flat(&data).unwrap();
assert_eq!(exp, value);

类型映射表

以下表示 minicbor-ser 将如何映射 Rust 和 CBOR 的类型

  • ❌ : 不支持
  • ⚠ : 还不完美
Rust CBOR
无符号整数 无符号整数
负整数 负整数
u128
i128
&str 字符串
字符串 字符串
结构体 映射(如果 flatten_top 为 false)
映射 映射
切片 数组(如果 flatten_top 为 false)
&[u8] 字节
元组 数组(如果 flatten_top 为 false)
Vec 数组(如果 flatten_top 为 false)
Vec 字节
新类型变体 映射
单元变体 字符串
元组变体 数组
结构体变体 映射

无 std

minicbor-ser 的当前 no-std 功能需要 alloc。如果您的机器不能使用 alloc,建议您使用 minicbor 附件的 derive 功能。
要启用 no-std,请使用

[dependencies]
minicbor-ser = { version = "0.1.*", default-features = false }

注意

某些序列化和反序列化的类型可能与 minicbor 的实现方式不同。如果您需要 minicbor 的默认实现,请使用 minicbor_ser::cbor 来访问其 API。

依赖

~2MB
~44K SLoC