#serialization #deserialize #binary #decode #encode #encode-decode

bincode-thin

bincode的一个分支,具有实验性修改以实现更小的序列化大小(用于webrender)

1个稳定版本

使用旧的Rust 2015

1.1.2 2019年4月2日

#16#serialize

MIT 许可证

69KB
2K SLoC

Bincode

Build Status

一个紧凑的编码/解码器对,使用二进制零填充编码方案。编码对象的尺寸将与在运行中的Rust程序中对象占用的内存大小相同或更小。

除了公开两个简单的函数(一个将编码到 Vec<u8>,另一个从 &[u8] 解码)之外,binary-encode还公开了Reader/Writer API,使其能够与rust文件、网络流和flate2-rs压缩库等基于流的API完美配合。

API文档

野外的Bincode

  • google/tarpc:Bincode用于序列化和反序列化网络RPC消息。
  • servo/webrender:Bincode记录webrender API调用,用于记录/回放式图形调试。
  • servo/ipc-channel:Ipc-Channel使用Bincode通过类似API的通道在进程之间发送结构。

示例

#[macro_use]
extern crate serde_derive;
extern crate bincode;

use bincode::{serialize, deserialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Entity {
    x: f32,
    y: f32,
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct World(Vec<Entity>);

fn main() {
    let world = World(vec![Entity { x: 0.0, y: 4.0 }, Entity { x: 10.0, y: 20.5 }]);

    let encoded: Vec<u8> = serialize(&world).unwrap();

    // 8 bytes for the length of the vector, 4 bytes per float.
    assert_eq!(encoded.len(), 8 + 4 * 4);

    let decoded: World = deserialize(&encoded[..]).unwrap();

    assert_eq!(world, decoded);
}

详细信息

编码(以及因此解码)按预期进行 - 基本类型按底层 Writer 编码,元组和结构通过逐个编码其字段进行编码,枚举通过首先写出表示变体的标签然后写出内容进行编码。

但是,有一些实现细节需要注意

  • isize/usize被编码为i64/u64,以提高可移植性。
  • 枚举变体被编码为 u32 而不是 usize。对于所有实际用途,u32 已经足够。
  • str 被编码为 (u64, &[u8]),其中 u64 是编码字符串中包含的字节数。

依赖关系

~200–475KB