安装protoc https://github.com/protocolbuffers/protobuf/releases
toml
prost = "0.14.1"
tokio-stream = { version = "0.1", features = ["net"] }
bytes = "1.11.0"
prost-types = "0.14.1"[build-dependencies]
prost-build = "0.14.1"
build.rs
fn main() {// 编译 .proto 文件prost_build::compile_protos(&["src/protos/biz_activity.proto"], &["src/protos/"]).unwrap();
}
proto
syntax = "proto3";package biz_activity;// 定义业务活动消息
message BizActivity {optional string id = 1;optional string name = 2;optional int32 status = 3;optional int64 create_time = 4; // 使用时间戳optional string additional_field = 5;
}
main.rs
use std::time::{SystemTime, UNIX_EPOCH};
use prost::Message;// 引入生成的 Protobuf 结构
mod protos {include!(concat!(env!("OUT_DIR"), "/biz_activity.rs"));
}use protos::BizActivity as ProtobufBizActivity;#[tokio::main]
async fn main() {// 演示 Protobuf 功能:将数据转换为 Protobuf 格式let protobuf_activity = ProtobufBizActivity {id: Some("protobuf_id".to_string()),name: Some("Protobuf 活动".to_string()),status: Some(1),create_time: Some(SystemTime::now().duration_since(UNIX_EPOCH).expect("时间获取失败").as_secs() as i64),additional_field: Some("Protobuf 额外信息".to_string()),};// 序列化为字节let encoded_data: Vec<u8> = protobuf_activity.encode_to_vec();println!("Protobuf 数据大小: {} 字节", encoded_data.len());// 反序列化let decoded_activity = ProtobufBizActivity::decode(&encoded_data[..]).unwrap();println!("解码后的活动名称: {:?}", decoded_activity.name);
}

编译后的源码在 target/debug/build/项目名-哈希/out/目录中
// This file is @generated by prost-build.
/// 定义业务活动消息
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct BizActivity {#[prost(string, optional, tag = "1")]pub id: ::core::option::Option<::prost::alloc::string::String>,#[prost(string, optional, tag = "2")]pub name: ::core::option::Option<::prost::alloc::string::String>,#[prost(int32, optional, tag = "3")]pub status: ::core::option::Option<i32>,/// 使用时间戳#[prost(int64, optional, tag = "4")]pub create_time: ::core::option::Option<i64>,#[prost(string, optional, tag = "5")]pub additional_field: ::core::option::Option<::prost::alloc::string::String>,
}