proto3 枚举生成疑问

113 天前
 a33291

比如如下定义

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的,但是,是否有选项可以控制这种行为?

谢谢

1090 次点击
所在节点    问与答
4 条回复
a33291
113 天前
另外我看了官方仓库 grpc 中的 csharp 部分,没看到其中的这种处理逻辑在哪里完成的
这个 Grpc.Tools 工具貌似只是为了构建一个 msbuild task 拼接 protoc 命令执行生成代码
这和我直接执行 protoc 生成的代码是一样的,所以逻辑应该不在 Grpc.Tools

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1068011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX