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 次下载
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 版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在作品中的贡献,应如上所述双许可,不附加任何额外条款或条件。
依赖关系
~0.4–1MB
~22K SLoC