3 个稳定版本
使用旧的 Rust 2015
1.0.2 | 2018 年 6 月 8 日 |
---|---|
1.0.1 | 2018 年 6 月 7 日 |
1.0.0 | 2018 年 3 月 6 日 |
#17 in #concise
90KB
2K SLoC
DBOR - Dq 的二进制对象表示
DBOR 是一种基于 CBOR 的序列化格式,专为 Rust 设计,并针对速度和文件大小进行了优化。它与 io 流交互时使用缓冲读取和写入系统,以实现最大效率。
示例用法
(来自 serde_json 的教程)
Cargo.toml
[dependencies]
serde = "*"
serde_derive = "*"
serde_dbor = "*"
main.rs
extern crate serde;
extern crate serde_dbor;
#[macro_use]
extern crate serde_derive;
use serde_dbor::Error;
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
age: u8,
phones: Vec<String>
}
fn example<'a>(data: &'a [u8]) => Result<(), Error> {
// Parse the data into a Person object.
let p: Person = serde_dbor::from_slice(data)?;
// Do things just like with any other Rust data structure.
println!("Please call {} at the number {}", p.name, p.phones[0]);
Ok(())
}
规范
DBOR 与 CBOR 类似,由指令字节和附加内容字节组成。然而,在 DBOR 中,每个项目的内容之前都需要进行描述,这意味着不允许不定长数组、字符串或映射,因为它们需要在项目末尾有终止字节。指令字节分为两个部分,分别为 3 位和 5 位。前 3 位定义了项目的类型,最后 5 位是该项的参数,在某些情况下可以是该项的值。例如,值为 21 的无符号整数存储为 0x15
,或 0b000 10101
,因为类型 0 (0b000
) 是 uint,该字节有足够的空间来编码数字 21 (0b10101
)。
当指令字节指示参数为一定大小时 n
,则下一个 n
个字节将被用于该参数,之后将是指令字节描述的项目的内容。例如,一个 u16
参数占用指令字节后的两个字节。然而,在序列化一个 u16
时,它可能被缩短为一个 u8
或指令字节本身。还应注意,DBOR 以小端格式存储多字节整数和浮点数,因为它使大多数机器上的序列化/反序列化速度更快(x86 使用小端)。
指令字节
类型 ID | 编码类型 | 参数描述 |
---|---|---|
0b000 (0 ) |
uint |
|
0b001 (1 ) |
整型 |
|
0b010 (2 ) |
其他 |
|
0b011 (3 ) |
变体(枚举) |
|
0b100 (4 ) |
序列(数组/元组/结构体) |
|
0b101 (5 ) |
字节(字符串/字节数组) |
|
0b110 (6 ) |
映射 |
|
0b111 (7 ) |
保留 |
|
命名变体字节
0-247
-0-247
的名称长度248
- 名称长度作为u8
249
- 名称长度作为u16
250
- 名称长度作为u32
251
- 名称长度作为u64
(仅在64位机器上)252-255
- 保留
注意:目前尚未实现使用命名变体的序列化,但已实现反序列化。
示例数据
Rust 代码
struct Data {
some_text: String,
a_small_number: u64,
a_byte: u8,
some_important_numbers: Vec<u16>,
}
let data = Data {
some_text: "Hello world!",
a_small_number: 0x04,
a_byte: 0x27,
some_important_numbers: vec![
0x1234,
0x6789,
0xabcd,
]
}
DBOR的注释十六进制转储
84 # Seq(4)
ac # Bytes(12)
48 65 6c 6c 6f 20...
77 6f 72 6c 64 21 # "Hello world!"
04 # uint(4)
18 # u8
27 # 0x27
83 # Seq(3)
19 # u16
34 12 # 0x1234
19 # u16
89 67 # 0x6789
19 # u16
cd ab # 0xabcd
依赖关系
~115–360KB