协议缓冲区 3:枚举作为映射中的键

2022-09-02 12:41:20

不允许将枚举用作映射中的键。PaxType 此处是枚举,不允许用作键。

enum PaxType {
    ADULT = 0 ;
    CHILD = 1 ;
    INFANT = 2 ;
}

message FlightData {
    map<PaxType, FareType> fareType = 1;
}

答案 1

这是不允许的,因为它不能很好地与proto3开放枚举语义一起使用。例如,在 Java 中,如果您有一个 Map,则键只能是定义的值之一。如果您碰巧从不在定义的值集中的远程客户端/服务器收到枚举键值,则无法将其放入 Map 中。这种限制迫使我们删除具有未知枚举键的映射条目(这违反了proto3开放枚举语义),或者不允许枚举作为映射键。

参考:https://groups.google.com/forum/#!topic/protobuf/ikeldBe60eI


答案 2

定义您自己的地图条目类型,例如:

enum MyEnum {
  FOO = 0;
  BAR = 1;
  BAZ = 2;
}

message MapEntry {
  MyEnum type = 1;
  int32 count = 2;
}

message MyMessage {
  repeated MapEntry counts = 1;
}

您将无法获得 的确切语义或行为,例如将具有相同键的重复条目简化为上次接收的值,但您将获得相同的兼容性优势和相同的通用实用程序。map