不允许枚举用作地图中的键。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
)。