#二进制 #序列化 #编码解码 #编码 #反序列化 #解码

nightly bincode_core

为serde提供的二进制序列化和反序列化策略与实现

1个不稳定版本

使用旧的Rust 2015

0.6.0 2016年11月17日

#4 in #serializes

MIT许可证

73KB
1.5K SLoC

Bincode

Build Status

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

除了暴露两个简单的编码到Vec和解码自Vec的函数外,binary-encode还暴露了Reader/Writer API,使其可以与其他基于流的API完美配合,例如rust文件、网络流和flate2-rs压缩库。

API文档

示例

extern crate bincode;
extern crate rustc_serialize;

use bincode::SizeLimit;
use bincode::rustc_serialize::{encode, decode};

#[derive(RustcEncodable, RustcDecodable, PartialEq)]
struct Entity {
    x: f32,
    y: f32,
}

#[derive(RustcEncodable, RustcDecodable, PartialEq)]
struct World {
    entities: Vec<Entity>
}

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

    let encoded: Vec<u8> = encode(&world, SizeLimit::Infinite).unwrap();

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

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

    assert!(world == decoded);
}

详情

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

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

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

依赖项

~47MB
~694K SLoC