协议缓冲区3:枚举作为地图中的键

Viv*_*nha 8 java enums hashmap protocol-buffers

枚举不允许在地图中用作键.这里的PaxType是枚举,不允许用作键.

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

message FlightData {
    map<PaxType, FareType> fareType = 1;
}
Run Code Online (Sandbox Code Playgroud)

Viv*_*nha 14

这是不允许的,因为它与proto3 open enum语义不能很好地兼容.例如,在Java中,如果您有Map,则该键只能是定义的值之一.如果您碰巧从远程客户端/服务器收到的枚举键值不在定义的值集中,则无法将其放入Map中.这种限制迫使我们要么使用未知的枚举键删除map entires(这是针对proto3开放枚举语义),要么将enum作为地图键一起禁止枚举.

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


C. *_*non 9

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

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

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

message MyMessage {
  repeated MapEntry counts = 1;
}
Run Code Online (Sandbox Code Playgroud)

您不会获得 a 的确切语义或行为map,例如具有相同键的重复条目被减少到最后接收的值,但您将获得相同的兼容性优势和相同的通用实用程序。