proto3 枚举生成疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a33291
V2EX    问与答

proto3 枚举生成疑问

  •  
  •   a33291 2024-08-27 08:50:56 +08:00 1395 次点击
    这是一个创建于 422 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如如下定义

    syntax = "proto3"; option csharp_namespace = "Demo"; option java_package = "Demo"; package Demo; enum Scenario { scenario_unknow=0; type1=1; scenario2=2; } enum Color { COLOR_RED = 0; COLOR_GREEN = 1; COLOR_BLUE = 2; } 

    生成的 C#代码

     #region Enums public enum Scenario { [pbr::OriginalName("scenario_unknow")] Unknow = 0, [pbr::OriginalName("type1")] Type1 = 1, [pbr::OriginalName("scenario2")] _2 = 2, } public enum Color { [pbr::OriginalName("COLOR_RED")] Red = 0, [pbr::OriginalName("COLOR_GREEN")] Green = 1, [pbr::OriginalName("COLOR_BLUE")] Blue = 2, } #endregion 

    java 代码

    public enum Scenario implements com.google.protobuf.ProtocolMessageEnum { /** * <code>scenario_unknow = 0;</code> */ scenario_unknow(0), /** * <code>type1 = 1;</code> */ type1(1), /** * <code>scenario2 = 2;</code> */ scenario2(2), UNRECOGNIZED(-1), ; } public enum Color implements com.google.protobuf.ProtocolMessageEnum { /** * <code>COLOR_RED = 0;</code> */ COLOR_RED(0), /** * <code>COLOR_GREEN = 1;</code> */ COLOR_GREEN(1), /** * <code>COLOR_BLUE = 2;</code> */ COLOR_BLUE(2), UNRECOGNIZED(-1), ; } 

    可以看到生成后的枚举成员中自动将枚举名称替换成空白了.这导致 Scenario.scenario2 生成的代码中成员名为 _2

    也许这多半是by design的,但是,是否有选项可以控制这种行为?

    谢谢

    第 1 条附言    2024-08-27 09:39:42 +08:00
    其实我是希望对于 C#而言,也保持原样就行(和 java 一样),目前看来除了自己修改源代码没有其他处理办法
    4 条回复    2024-08-27 09:36:20 +08:00
    a33291
        1
    a33291  
    OP
       2024-08-27 08:54:30 +08:00
    另外我看了官方仓库 grpc 中的 csharp 部分,没看到其中的这种处理逻辑在哪里完成的
    这个 Grpc.Tools 工具貌似只是为了构建一个 msbuild task 拼接 protoc 命令执行生成代码
    这和我直接执行 protoc 生成的代码是一样的,所以逻辑应该不在 Grpc.Tools

    Philippa
        2
    Philippa  
       2024-08-27 09:02:26 +08:00 via iPhone   1
    这是规范,你的 enum 就不符合规范。看 google 的 grpc 文档,或使用工具比如 buf lint 一下所有的错误。
    lqs
        3
    lqs  
       2024-08-27 09:20:13 +08:00   1
    按照规范(为了兼容 C 之类的语言),不能在两个 enum 里定义同样的成员名称,所以通常都给成员加上前缀
    然后有些语言的代码生成器会自动去掉这个前缀,所以就造成了这样的行为
    a33291
        4
    a33291  
    OP
       2024-08-27 09:36:20 +08:00
    处理逻辑在这里,的确没有 opt-out 选项

    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2797 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 13:24 PVG 21:24 LAX 06:24 JFK 09:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86