You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过tonic_build为生成的Rust文件添加serde的use语句?

解决方案

要在tonic生成的Rust文件中自动添加use serde::{Serialize, Deserialize};语句,你需要借助tonic_build底层依赖的prost_build提供的prepend_module_content方法,直接往生成的模块顶部插入所需的use声明。

具体实现代码

在你的build.rs中按如下方式配置:

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut builder = tonic_build::configure();

    // 为HelloRequest结构体添加serde的Derive属性
    builder = builder.type_attribute("HelloRequest", "#[derive(serde::Serialize, serde::Deserialize)]");

    // 往生成的模块顶部插入use语句
    builder.prost_build_config().prepend_module_content(
        "use serde::{Serialize, Deserialize};"
    );

    // 编译指定的proto文件
    builder.compile(&["proto/hello.proto"], &["proto/"])?;

    Ok(())
}

为什么server_mod_attribute不生效?

server_mod_attribute仅作用于tonic生成的服务端模块(比如HelloServiceServer所在的模块),用来给该模块添加属性,而非给所有生成的结构体所在的根模块插入use语句,所以你的尝试不会生效。

额外注意点

  • 确保Cargo.toml中已添加正确的依赖:
    [dependencies]
    serde = { version = "1.0", features = ["derive"] }
    tonic = "0.9"
    prost = "0.12"
    
  • 若要给所有生成的结构体批量添加serde Derive,可以用通配符:
    builder = builder.type_attribute("*", "#[derive(serde::Serialize, serde::Deserialize)]");
    

内容的提问来源于stack exchange,提问作者Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:18:37