2 个稳定版本
使用旧的 Rust 2015
2.0.1 | 2020年1月20日 |
---|
#1137 in 编码
4,352 每月下载量
在 34 个crate中使用 (19 直接使用)
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