#serde #serialization #binary-format #no-std

no-std pinecone

一个兼容 serde 的 no_std 消息库

7 个版本

0.2.5 2022 年 1 月 5 日
0.2.4 2021 年 12 月 13 日
0.2.3 2020 年 3 月 5 日
0.2.2 2019 年 12 月 8 日
0.1.0 2019 年 11 月 24 日

#2039 in 编码

每月 29 次下载

MIT/Apache

55KB
1.5K SLoC

松果 - Serde 另一个二进制格式

松果是 Postcard 的一个最小化 no_std + alloc 分支。

功能

松果始终假设反序列化的目标是正确的。尽管可以将其反序列化为不正确的类型,但这需要更少的空间并且解码更快。

用法

与任何其他正常的 serde 一样工作

use pinecone::{from_bytes, to_slice, to_vec};
use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
struct Example {
    foo: String,
    bar: Option<u32>,
    zot: bool,
}

fn main() {
    let original = Example {
        foo: "Vec test".to_string(),
        bar: Some(0x1337),
        zot: true,
    };

    let bytes: Vec<u8> = to_vec(&original).expect("Serialization failed");
    assert_eq!(from_bytes(&bytes), Ok(original));

    let original = Example {
        foo: "Slice test".to_string(),
        bar: Some(0x1337),
        zot: true,
    };

    let mut buffer = [0; 1024];
    to_slice(&original, &mut buffer).expect("Serialization failed");
    assert_eq!(from_bytes(&buffer), Ok(original));
}

可变长度数据

可变长度数据(如切片)以其长度为前缀。

长度以 Varint 编码。这是出于两个原因:当发送包含少于 127 个项目的切片(对嵌入式设备典型)时,可以最小化浪费的字节;以及由于 32 位和 64 位目标上 usize 大小不同,以减少兼容性问题。

类似地,枚举的描述符以 varint 编码,这意味着任何具有少于 127 个变体的枚举都将将其描述符编码为单个字节(而不是 u32)。

pinecone 中的 varints 具有该平台 usize 的最大值。实际上,这意味着 64 位目标不应向 32 位目标发送包含 (1 << 32) - 1 项的切片消息,这在实践中很少见。枚举区分符已经具有如 Rust 当前定义的固定最大值 (1 << 32) - 1。大于当前平台 usize 的 varints 将导致反序列化过程返回 Err

许可证

根据以下任一项获得许可

任选其一。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在作品中的贡献,应如上所述双许可,不附加任何额外条款或条件。

依赖关系

~0.4–1MB
~22K SLoC