【问题标题】: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。

标签: java protocol-buffers


【解决方案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 的值 .... 还有其他建议吗!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多