正式开始
如何学习
自定义编译protobuf
- 在项目根目录下,生成一个 abi.proto 文件,写入图片处理服务用到的数据结构
- 在项目根目录下,创建一个 build.rs,使用 prost 编译abi.proto生成protobuf
- build.rs 可以在编译 cargo 项目时,做额外的编译处理
- mkdir src/pb 创建文件夹
- 运行 cargo build,在 src/pb 下生成 abi.rs ,包含了从 protobuf 消息转换出来的 Rust 数据结构
- 创建 src/pb/mod.rs导出一些辅助函数。一个目录下的所有代码,可以通过 mod.rs 声明
链接
新鲜知识点
-
可以编辑 ~/.cargo/config,让所有项目的编译结果都放在同一个目录下(不过这样无法同时编译多个项目,cargo 有文件锁)
[build] target-dir = "/Users/tchen/.target" -
Rust 下只要加了依赖,对应的依赖就可以访问,不存在 import 的过程。use 只是简化 namespace
精选问答
-
prost这个依赖的tag是有什么作用?
a. protobuf 在传统的用于网络协议定义可选字段的方法 TLV(Type/Tag Length Value)上发展了变长的编码方式,将这三者巧妙的融合在了protobuf的定义语言中,其实质还是 TLV
b. uint32 x1 = 1; 的 uint32 确定了 length(以及对应的编程语言的类型),而 = 1 则声明了 tag。当你序列化一个 Crop struct 到 protobuf 二进制时,每个字段的值会带上 tag 和 length。这样别人就能通过这个信息反序列化出来。