项目介绍:quick-protobuf
概述
quick-protobuf
是一个纯 Rust 实现的库,用于对 protobuf
文件进行序列化和反序列化。该库的设计目标是提供一个简单且快速的 protobuf
解析器,并实现最小化内存分配的高效功能。
功能描述
quick-protobuf
库主要提供两部分功能:
-
pb-rs:这是一个代码生成工具
-
每个
.proto
文件会生成一个精简的 Rust 模块,该模块包含读取、写入和计算消息大小的函数。 -
每个
protobuf
消息将生成对应的 Rust 结构体,其中数据类型的映射如下表所示:Proto Rust bytes Cow<'a, [u8]>
string Cow<'a, str>
其它标量 Rust 原始类型 repeated Vec
repeated, packed, fixed size Cow<'a, [M]>
optional Option
message struct
enum enum
map HashMap
oneof Name OneOfName
enum嵌套 m1
mod_m1
module包 a.b
mod_a::mod_b
modules导入 file_a.proto
use super::file_a::*
-
不需要使用谷歌提供的
protoc
工具生成模块。
-
-
quick-protobuf:这是一个
protobuf
文件解析器- 通常在库中会引用此 crate。生成的模块假设已经导入。
- 它起到事件解析器的作用,将解析逻辑转换为结构体的过程由
pb-rs
负责处理。
快速入门指南:protobuf_example 项目
-
安装 pb-rs 二进制文件以便将
.proto
文件转换为与 quick-protobuf 兼容的源代码。cargo install pb-rs pb-rs /path/to/your/protobuf/file.proto
这将生成一个
/path/to/your/protobuf/file.rs
文件。 -
添加 quick-protobuf 作为依赖项。
# Cargo.toml [dependencies] quick-protobuf = "0.8.0"
-
编写你的应用程序。
extern crate quick_protobuf; mod foo_bar; use quick_protobuf::Reader; use foo_bar::FooBar; use quick_protobuf::{MessageRead, BytesReader}; fn main() { let mut bytes: Vec<u8>; # bytes = vec![]; let mut reader = BytesReader::from_bytes(&bytes); let foobar = FooBar::from_reader(&mut reader, &bytes).expect("Cannot read FooBar"); println!("Found {} foos and {} bars", foobar.foos.len(), foobar.bars.len()); }
优缺点分析
相比于市场上使用广泛的 rust-protobuf
,quick-protobuf
提供了一些独特的优势:
-
优点
- 快速性能,特别是在处理字符串、字节和重复的固定大小字段时无需额外分配空间。
- 无需安装
protoc
工具。 - 没有使用 trait 对象,因此解析器更加快速和简单。
- 生成的模块非常简单,代码量小 (~10x 更小)。
-
缺点
- 相对流行度较低。
- 大多数
rust-protobuf
测试已经迁移至此。 quick-protobuf
已被许多人使用,并且非常可靠。- 一些功能尚待实现。
- 大多数
- 并非
rust-protobuf
的直接替代品。- 由于一切都是显式的,用户需要自行处理更多内容(例如
Option
解包、Cow
管理)。
- 由于一切都是显式的,用户需要自行处理更多内容(例如
- 相对流行度较低。
贡献与许可
欢迎任何形式的贡献,包括但不限于拉取请求、错误报告以及可改进的功能。该项目使用 MIT 许可证发布,用户可以自由使用和修改。