1个不稳定版本
使用旧的Rust 2015
0.6.0 | 2016年11月17日 |
---|
#4 in #serializes
73KB
1.5K SLoC
Bincode
一个紧凑的编码/解码器对,使用二进制零填充编码方案。编码对象的尺寸将与在运行中的Rust程序中对象占用的内存大小相同或更小。
除了暴露两个简单的编码到Vec和解码自Vec的函数外,binary-encode还暴露了Reader/Writer API,使其可以与其他基于流的API完美配合,例如rust文件、网络流和flate2-rs压缩库。
示例
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