rust使用protobuf

安装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);
}

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>,
}

posted @ 2025-12-23 18:36  朝阳1  阅读(5)  评论(0)    收藏  举报