#cbor #reader-writer #derive #serialization #macro-derive #cbored #cbor-repr

cbored-derive

CBOR 精确读取器和写入器(CborRepr derive 宏)

5 个版本 (3 个破坏性更新)

0.4.0 2024年4月1日
0.3.2 2023年12月22日
0.3.1 2022年8月18日
0.2.0 2022年8月16日
0.1.0 2022年4月26日

#81 in #cbor

Download history 7/week @ 2024-04-15 21/week @ 2024-04-22 11/week @ 2024-04-29 23/week @ 2024-05-06 19/week @ 2024-05-13 22/week @ 2024-05-20 2/week @ 2024-05-27 13/week @ 2024-06-03 4/week @ 2024-06-10 1/week @ 2024-06-17 9/week @ 2024-06-24 53/week @ 2024-07-01 77/week @ 2024-07-08 1/week @ 2024-07-15 31/week @ 2024-07-29

每月下载量110次
3 个crate中使用(通过 cbored

MIT/Apache

57KB
1K SLoC

cbored - 精确CBOR

cbored 是一个CBOR读取器和写入器,专注于精确的1-1 CBOR表示。

设计决策

此CBOR crate基于以下决策

  • 尽可能接近CBOR类型
  • 能够恢复给定编码CBOR类型的精确字节,特别是在非规范CBOR使用的情况下
  • 隐藏给定CBOR类型中的不定/定选项,以保持使用简单

主要用例是处理不需要一个规范表示的CBOR数据流(标准CBOR规范或另一个),并且需要保持序列化数据的原样(例如,在加密设置中使用时)

注意

  • 由于在我的用例中没有使用,有符号整数支持不是很好,因此有很多缺失的转换;欢迎贡献

自动CBOR编码和解码derive

可以在 Cargo.toml 中启用自动proc-macro derive

cbored = { version = "0.1", features = ["derive"] }

这允许为枚举和结构类型生成解码和解码实现

#[derive(CborRepr)]
#[cborrepr(structure = "array")]
// serialized as : ARRAY(2) [UINT, UINT]
pub struct Point {
    x: u32,
    y: u32,
}

#[derive(CborRepr)]
#[cborrepr(structure = "array_lastopt")]
// serialized as : ARRAY(2) [UINT, UINT]
//            or : ARRAY(1) [UINT]
pub struct Point {
    x: u32,
    y: Option<u32>,
}

#[derive(CborRepr)]
#[cborrepr(structure = "flat")]
// serialized as : UINT, UINT
pub struct FlatPoint {
    x: u32,
    y: u32,
}

#[derive(CborRepr)]
#[cborrepr(structure = "mapint")]
// serialized as : MAP(2) { UINT(0) => UINT, UINT(1) => UINT }
//            or : MAP(3) { UINT(0) => UINT, UINT(1) => UINT, UINT(2) => UINT }
pub struct FlatPoint {
    #[cborrepr(mandatory)]
    x: u32,
    #[cborrepr(mandatory)]
    y: u32,
    z: Option<u32>
}

#[derive(CborRepr)]
#[cborrepr(enumtype = "tagvariant")]
// serialized as
// * One : ARRAY(2) [ UINT(0), UINT ]
// * Two : ARRAY(3) [ UINT(1), UINT, TEXT ]
// * Three : ARRAY(2) [ UINT(2), ARRAY(2) [ UINT, UINT ] ]
// * Four : ARRAY(1) [ UINT(3) ]
pub enum Variant {
    One(u32),
    Two(u64, String),
    Three(Point),
    Four,
}

#[derive(CborRepr)]
#[cborrepr(enumtype = "enumint")]
// serialized as
// * Code1 : UINT(0)
// * Code2 : UINT(1)
// * Code3 : UINT(2)
pub enum Code {
    Code1,
    Code2,
    Code3,
}

#[derive(CborRepr)]
#[cborrepr(enumtype = "enumtype")]
// serialized as
// * Empty : NULL
// * One   : UINT
pub enum OneOrEmpty {
    #[cborrepr(cbortype = "null")]
    Empty,
    #[cborrepr(cbortype = "positive")]
    One(u64),
}

结构

  • array:结构序列化在长度反映元素数量的数组中一个接一个
  • flat:每个字段一个接一个序列化,使用每个类型的Decode/Encode实例。通常不推荐在一般情况下使用,因为它不与数组/映射结构很好地配合。
  • mapint:结构序列化为一个映射,其中键索引是字段相对于map_starts_at参数的索引(如果不存在,则从0开始)

枚举

  • tagvariant:带有一个表示变体的整数的数组,后面跟任何字段
  • enumint:只有一个整数的变体,没有内部元素。整数在变体之间顺序递增,并从0开始

依赖关系

~250–690KB
~16K SLoC