协议缓冲区:枚举问题
Posted
技术标签:
【中文标题】协议缓冲区:枚举问题【英文标题】:Protocol Buffer: Enum issue 【发布时间】:2011-10-31 10:30:30 【问题描述】:我有以下 .proto 文件:
enum Enum1
X=0;
Y=1;
message SomeClass
required Enum1 enum1=1;
required Enum2 enum2=2;
enum Enum2
X=0;
Z=1;
当我尝试使用 protoc 编译它时,我收到以下错误:
proto.proto:19:5: "X" 已经定义 proto.proto:19:5: 注意 枚举值使用 C++ 范围规则,这意味着枚举值是 他们类型的兄弟姐妹,而不是它的孩子。因此,“X”必须是 unique ,而不仅仅是在“Enum2”中。
我有什么办法可以克服这个问题!
【问题讨论】:
你的意思是重命名 X @ Enum2 !如果是,我现在不能,因为它依赖于应用程序, 你有两个相同的枚举实例,X。 【参考方案1】:您可以将您的枚举包含在另一条消息中,这样可见性就不会发生冲突。
示例:
message Enum1
enum Enum
X=0;
Y=1;
message Enum2
enum Enum
X=0;
Y=1;
message SomeClass
required Enum1.Enum enum1=1;
required Enum2.Enum enum2=0;
你也可以在你的枚举值前面加上一些东西。如果您不更改值名称后的数字,它应该与您的旧版本保持兼容: 例如:
enum Enum1
E1_X=0;
E1_Y=1;
enum Enum2
E2_X=0;
E2_Z=1;
message SomeClass
required Enum1 enum1=1;
required Enum2 enum2=2;
【讨论】:
required 已从 proto3 中移除 这个问题有 8 年历史了。如果不需要使用它,它将与 proto3 一起使用。【参考方案2】:你可以在枚举中使用前缀然后
enum Enum1
E1_X=0;
E1_Y=1;
message SomeClass
required Enum1 enum1=1;
required Enum2 enum2=2;
enum Enum2
E2_X=0;
E2_Z=1;
【讨论】:
【参考方案3】:而不是
message SomeClass
required Enum1 enum1=1;
required Enum2 enum2=2;
我认为你应该有类似的东西
message SomeClass
required Enum1 enum1.Y;
required Enum2 enum2.Z;
编辑:您将其标记为 Java,但在您提到 c++ 的问题中,它是女巫吗?
编辑2: 谷歌搜索了一下后,我发现了这个http://www.mail-archive.com/protobuf@googlegroups.com/msg04986.html
您需要将 enum1.X 或 enum2.x 重命名为其他名称,以免它们发生冲突。
enum Enum1
W=0;
Y=1;
message SomeClass
required Enum1 enum1=1;
required Enum2 enum2=0;
enum Enum2
X=0;
Z=1;
如果你真的因为应用程序依赖而不能,我想你需要以某种方式重新设计你的程序..
【讨论】:
我使用 Java,但是当我使用 protoc 编译器编译我的 .proto 文件时,我得到了我提到的错误。 但是您提到的这种方式,Enum1 将始终具有 enum1.Y 的值 .... 还有其他建议吗!以上是关于协议缓冲区:枚举问题的主要内容,如果未能解决你的问题,请参考以下文章