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);
}
![image]()
编译后的源码在 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>,
}