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

bincode2

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

2 个稳定版本

使用旧的 Rust 2015

2.0.1 2020年1月20日

#1137 in 编码

Download history 1721/week @ 2024-03-13 2027/week @ 2024-03-20 1033/week @ 2024-03-27 1498/week @ 2024-04-03 1220/week @ 2024-04-10 1122/week @ 2024-04-17 1020/week @ 2024-04-24 853/week @ 2024-05-01 993/week @ 2024-05-08 725/week @ 2024-05-15 1027/week @ 2024-05-22 895/week @ 2024-05-29 996/week @ 2024-06-05 650/week @ 2024-06-12 1486/week @ 2024-06-19 1032/week @ 2024-06-26

4,352 每月下载量
34 个crate中使用 (19 直接使用)

MIT 许可证

76KB
2K SLoC

Bincode 2

现在已废弃的 Bincode 的维护分支。

使用二进制零填充编码方案的紧凑编码/解码器对。编码对象的尺寸将与在运行中的 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 在进程之间发送结构体。

示例

use serde::{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> = bincode2::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 = bincode2::deserialize(&encoded[..]).unwrap();

    assert_eq!(world, decoded);
}

详情

编码(以及相应的解码)按预期进行——原始类型根据底层的 Writer 进行编码,元组和结构体通过逐个编码它们的字段进行编码,枚举通过首先写出表示变体的标签,然后写出内容进行编码。

然而,还有一些实现细节需要注意。

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

依赖项

约 200–470KB