V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
a33291
V2EX  ›  问与答

proto3 枚举生成疑问

  •  
  •   a33291 · 23 天前 · 918 次点击

    比如如下定义

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

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

    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5709 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 01:56 · PVG 09:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.