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

nightly bincode-no-std

使用 Serde 将结构体转换为字节并相反的二进制序列化/反序列化策略!

1 个稳定版本

使用旧的 Rust 2015

1.0.0 2018 年 3 月 16 日

#33#binary-serialization


用于 wasm-core

MIT 许可证

200KB
3.5K SLoC

Bincode

Build Status

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

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

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 表示编码字符串中包含的字节数。

依赖项

~46MB
~670K SLoC