#serde #byte #format #file-format #compression #deserialize #sbif

serde-sbif

基于 Serde 的 SBIF 文件格式实现

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