协议缓冲区:枚举问题

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 的值 .... 还有其他建议吗!

以上是关于协议缓冲区:枚举问题的主要内容,如果未能解决你的问题,请参考以下文章

Google 协议缓冲区交叉编译

您如何管理协议缓冲区定义文件?

协议缓冲区扩展和 toString()

协议缓冲区 Java 解析问题

协议缓冲区 - 用例

在协议缓冲区中定义字典