查看: 187|回复: 1

[教程] Rust中Protobuf使用详解

[复制链接]

3

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2008-2-10
发表于 2025-11-11 09:38:04 | 显示全部楼层 |阅读模式

Protobuf(Protocol Buffers)是 Google 推出的高效序列化协议;Rust中,prost 是最主流的 Protobuf 实现,提供了编译期代码生成和运行时序列化/反序列化能力。

工具与环境

必备工具:

  • protoc:Protobuf 官方编译器(负责解析 .proto 文件)
  • prost:Rust 的 Protobuf 运行时库(提供序列化 / 反序列化逻辑)
  • prost-build:Rust 的 Protobuf 编译工具(集成 protoc,生成 Rust 代码)

windows下protoc安装(winget方式):

  1. winget search protoc
  2. winget install Google.Protobuf
  3. protoc --version:# 输出 libprotoc 33.0 或更高版本即可

项目中使用

配置Cargo.toml

添加prost与prost-build的依赖,

[dependencies]
prost = "0.14.1"
[build-dependencies]
prost-build = "0.14.1"

proto文件

在项目中添加proto/hello.proto文件:

syntax = "proto3";
package hello;
message MyMessage {
  string name = 1;
  int32 id = 2;
}

build脚本

在项目根目录添加build.rs用于把proto文件编译为rs文件:

  • out_dir:设定编译rs文件存放位置(如"src/pb"下);
  • compile_protos:编译
    • 第一个参数为要编译proto文件(包含相对目录);可以指定多个proto文件
    • 第二个参数proto所在路径
use prost_build;
fn main() {
    println!("cargo:rerun-if-changed=hello.proto");
    // try create the output folder
    std::fs::create_dir_all("src/pb").expect("Failed to create output directory");
    // compile the proto file
    prost_build::Config::new()
        .out_dir("src/pb")
        .compile_protos(&["proto/hello.proto"], &["proto/"])
        .expect("Failed to compile proto files");
}

build成功后,会在src/pb下创建hello.rs(与proto文件中的package名称相同)文件。

使用proto

生成rs文件后,即可使用:

  • 通过include!宏,直接包含对应rs文件
  • 通过use引入
    • 在pb下创建mod.rs,并添加pub mod hello;
    • 在main中引入:mod pb; use pb::hello::MyMessage;
// include!("pb/hello.rs");
mod pb;
use pb::hello::MyMessage;
use prost::Message;
fn main() {
    let msg = MyMessage {
        name: "Protobuff example".to_string(),
        id: 123,
    };
    let encoded = msg.encode_to_vec();
    println!("Encoded Msg: {:?}", encoded);
    let decoded = MyMessage::decode(&encoded[..]).unwrap();
    println!("Decoded Msg: {:?}", decoded);
}

到此这篇关于Rust中Protobuf使用简介的文章就介绍到这了,更多相关Rust Protobuf使用内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!

您可能感兴趣的文章:
  • rust 中生成与使用protobuf的方法
回复

使用道具 举报

0

主题

2331

回帖

1万

积分

琼殿精英

金币
11777
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2011-10-11
发表于 7 天前 | 显示全部楼层
看到这么详细的Rust+Protobuf教程必须来顶一下!干货满满,讲解得非常清晰明了~

之前一直想学在Rust里用Protobuf,但是百度搜到的教程都写得糊里糊涂的,看得云里雾里。这篇帖子从环境配置到实际使用一步一步写得非常详细,照着操作一遍就能跑通了,给作者点个赞!已收藏

特别是build.rs的部分,之前一直搞不懂out_dir和compile_protos的参数怎么写,这回终于搞明白了原来是这么回事。感谢分享!

有个小问题想请教一下:
如果项目比较大的话,每个proto文件都手动写build.rs感觉有点麻烦,请问有没有更优雅的写法?比如自动扫描某个目录下的所有proto文件然后批量编译?

另外想问一下,如果我想在编译期生成proto代码而不是像这样在build时生成,有没有办法实现?看到有些项目直接把生成的.rs文件提交到仓库里,这种方式有什么优缺点吗?

最后再次感谢楼主的无私分享!源码公社有您更精彩! :D

返回源码公社
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

圆梦公社,专注于为全球华人提供纯粹技术交流的地方,请勿发布任何政治及违法的言论。如有相关侵权、举报、投诉及建议等,请发 E-mail:dzh188@hotmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部