协议缓冲区:枚举问题

Ech*_*cho 14 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;    
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用protoc来编译它时,我收到以下错误:

proto.proto:19:5:"X"已定义为proto.proto:19:5:请注意,枚举值使用C++作用域规则,这意味着枚举值是其类型的兄弟,而不是它的子类.因此,"X"必须是唯一的,而不仅仅是"Enum2".

我有办法克服这个问题!

Mik*_*ike 12

您可以在另一个消息中包含枚举,这样可见性就不会冲突。

范例:

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;
}
Run Code Online (Sandbox Code Playgroud)

您也可以在枚举值前加上一些前缀。如果您不更改数值名称后的数字,则该数值应与旧版本兼容:例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题8岁了。如果不需要使用,它将与proto3一起使用。 (2认同)

Rag*_*ock 0

代替

message SomeClass{
required  Enum1 enum1=1;
required Enum2 enum2=2; }
Run Code Online (Sandbox Code Playgroud)

我想你应该有类似的东西

message SomeClass{
    required  Enum1 enum1.Y;
    required Enum2 enum2.Z;
}
Run Code Online (Sandbox Code Playgroud)

编辑:您将其标记为 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;    
}
Run Code Online (Sandbox Code Playgroud)

如果由于应用程序依赖性你真的不能,我想你需要以某种方式重新设计你的程序..