1 个稳定版本
使用旧的 Rust 2015
1.0.0 | 2018 年 3 月 16 日 |
---|
#33 在 #binary-serialization
用于 wasm-core
200KB
3.5K SLoC
Bincode
一个紧凑的编码/解码器对,使用二进制零填充编码方案。编码对象的尺寸将与对象在运行中的 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