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

时间:2016-12-14 08:32:14

标签: java enums hashmap protocol-buffers

不允许将枚举用作地图中的键。这里的PaxType是一个枚举,不允许用作密钥。

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

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

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:1)

正如 Vivek Sinha 已经说过的那样,不允许将枚举用作地图中的键。但是,您可以使用列表并按照定义枚举的相同顺序填充它。例如,当您编写一个使用生物群落的游戏时,您希望拥有从 biom type 到世界中 number of existing bioms 的映射。这可以按如下方式完成:

enum BiomType {
    PLACEHOLDER = 0;
    FOREST = 1;
    DESERT = 2;
}

message Map {
    repeated int32 biom_distribution = 1;
}

当您填充 biom_distribution 列表时,您必须保持枚举中元素的顺序(在本例中为 BiomType)。