1 个不稳定版本
0.1.0 | 2023年12月30日 |
---|
#2795 in 解析器实现
62KB
1.5K SLoC
Serde SBIF
Serde SBIF 是一个将数据序列化为受游戏 Minecraft 中的 NBT 格式启发的紧凑格式的 crate。
使用方法
要使用此 crate,请将其添加到您的 Cargo.toml 文件中,并包含最新的 Serde crate 版本。
[dependencies]
serde_sbif = { git = "https://github.com/k2green/serde-sbif/" }
然后可以使用 serde_sbif::to_bytes 和 serde_sbif::to_writer 函数将数据序列化为 SBIF。数据也可以使用 serde_sbif::from_slice 和 serde_sbif::from_reader 函数反序列化。
use serde::{Serialize, Deserialize};
use serde_sbif::{to_bytes, Result, Compression};
#[derive(Serialize, Deserialize)]
struct Address {
street: String,
city: String,
}
fn serialize() -> Result<Vec<u8>> {
// Some data structure.
let address = Address {
street: "10 Downing Street".to_owned(),
city: "London".to_owned(),
};
// Serialize it to a SBIF byte vec.
let serialized = serde_sbif::to_bytes(&address, Compression::default())?;
Ok(serialized)
}
SBIF 格式
结构化二进制交换格式 (SBIF) 是一个旨在以压缩或未压缩状态存储大量结构化数据的格式。
一个 SBIF 文件由一个 8-12 字节的短标题组成,其中包含版本号和压缩格式,随后是带有 id 的数据块。id 是一个字节,它标识了后续字节代表的内容,布局如下
ID | 名称 | 描述 |
---|---|---|
0 | 空 | 这是一个单字节块,代表 Rust 中各种类似 "null" 的对象,包括 Option::None、() 和单元结构。 |
1 | 布尔 | 1 标记一个布尔值,其后应跟一个字节,该字节为 0 表示 false 或任何非零数字表示 true |
2 | i8 | 此 ID 标记后续字节为有符号 8 位值。 |
3 | i16 | 此 ID 标记后续 2 个字节为有符号 16 位值,字节顺序为大端。 |
4 | i32 | 此 ID 标记后续 4 个字节为有符号 32 位值,字节顺序为大端。 |
5 | i64 | 此 ID 标记后续 8 个字节为有符号 64 位值,字节顺序为大端。 |
6 | ui8 | 此 ID 标记后续字节为无符号 8 位值。 |
7 | u16 | 此 ID 标记后续 2 个字节为无符号 16 位值,字节顺序为大端。 |
8 | u32 | 此 ID 标记后续 4 个字节为无符号 32 位值,字节顺序为大端。 |
9 | u64 | 此 ID 标记后续 8 个字节为无符号 64 位值,字节顺序为大端。 |
10 | f32 | 此 ID 标记后续 4 个字节为 32 位浮点值,字节顺序为大端。 |
11 | f64 | 此ID将以下8个字节标记为64位浮点数,采用大端字节序。 |
12 | char | 这是一个Utf8字符,由以下1-4个字节表示(根据Utf8规范) |
13 | str | 字符串后面应跟字符串的字节长度,作为大端字节序的u32。然后是字符串。 |
14 | bytes | 原始字节序列的表示方式与字符串相同。ID之后应跟序列长度的big endean u32,然后是字节序列。 |
15 | seq | 序列遵循类似的模式。ID之后应跟一个u32长度,类似于字符串,但这个长度是序列中不同项的数量,而不是字节长度。然后是嵌套序列化的对象序列。 |
16 | Tuple | 元组遵循与序列相同的模式。ID之后是项数,然后是序列化后每个项的长度。 |
17 | Unit variant | Unit枚举变体使用唯一ID以简化反序列化。ID之后应跟一个big endean u32,表示枚举的具体变体。 |
18 | Enum variant | 枚举变体以与unit变体相同的方式开始,id之后是作为u32的变体,但后续数据取决于变体类型。参见Seq或Map。 |
19 | Tuple struct | 此结构与元组类似,ID之后应跟一个big endean u32,表示元素数量,然后是序列化项的序列。 |
20 | Map | 映射和结构都使用映射ID表示。ID之后是键值对的数量,作为big endean u32。然后是序列化的键值对。 |
依赖
~1–1.7MB
~34K SLoC