协议缓冲区:枚举问题

时间:2011-10-31 10:30:30

标签: java protocol-buffers

我有以下.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”必须是   独特,不仅仅在“Enum2”中。

我有办法克服这个问题!

3 个答案:

答案 0 :(得分:6)

您可以在另一条消息中包含您的枚举,以便可见性不会发生冲突。

例如:

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;
}

答案 1 :(得分:0)

而不是

message SomeClass{
required  Enum1 enum1=1;
required Enum2 enum2=2; }

我认为你应该有像

这样的东西
message SomeClass{
    required  Enum1 enum1.Y;
    required Enum2 enum2.Z;
}

编辑:你把它标记为Java,但在你提到c ++的问题中,它是一个吗?

EDIT2: 谷歌搜索后,我发现了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;    
}

如果您因为应用程序依赖性而无法解决,我猜您需要以某种方式重新设计您的程序..

答案 2 :(得分:0)

您可以在枚举中使用前缀,然后

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;    
}