1个稳定版本
使用旧的Rust 2015
1.1.2 | 2019年4月2日 |
---|
#16 在 #serialize
69KB
2K SLoC
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的通道在进程之间发送结构。
示例
#[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