协议缓冲区3:地图中的钥匙枚举



不允许枚举用作地图中的键。paxtype这是一个枚举,不允许用作钥匙。

enum PaxType {
    ADULT = 0 ;
    CHILD = 1 ;
    INFANT = 2 ;
}
message FlightData {
    map<PaxType, FareType> fareType = 1;
}

这是不允许的,因为它在proto3开放枚举语义上的作用不佳。例如,在Java中,如果您有地图,则键只能是定义的值之一。如果您碰巧从不在定义值集中的远程客户端/服务器中接收枚举键值,则无法将其放入地图中。这一限制迫使我们要么用未知的枚举键(反对原始枚举语义)丢弃地图条目,要么将枚举作为地图键都禁止。

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

定义自己的地图输入类型,例如:

enum MyEnum {
  FOO = 0;
  BAR = 1;
  BAZ = 2;
}
message MapEntry {
  MyEnum type = 1;
  int32 count = 2;
}
message MyMessage {
  repeated MapEntry counts = 1;
}

您将不会获得map的确切语义或行为,例如重复的条目,相同的键将降低到最后一个受过的值,但是您将获得相同的兼容性好处和相同的通用效用。/p>

正如Vivek Sinha所说的那样,不允许将枚举用作地图中的键。但是,您可以使用列表并按照定义枚举的顺序填充它。例如,当您对使用Bioms的游戏进行编程,并且您希望将映射从biom type到世界上的number of existing bioms。这可以如下完成:

enum BiomType {
    PLACEHOLDER = 0;
    FOREST = 1;
    DESERT = 2;
}
message Map {
    repeated int32 biom_distribution = 1;
}

当您填充biom_distribution列表时,您必须将元素的顺序保留在枚举中(在这种情况下为BiomType)。

最新更新