协议缓冲区 3:枚举作为映射中的键
2022-09-02 12:41:20
不允许将枚举用作映射中的键。PaxType 此处是枚举,不允许用作键。
enum PaxType {
ADULT = 0 ;
CHILD = 1 ;
INFANT = 2 ;
}
message FlightData {
map<PaxType, FareType> fareType = 1;
}
不允许将枚举用作映射中的键。PaxType 此处是枚举,不允许用作键。
enum PaxType {
ADULT = 0 ;
CHILD = 1 ;
INFANT = 2 ;
}
message FlightData {
map<PaxType, FareType> fareType = 1;
}
这是不允许的,因为它不能很好地与proto3开放枚举语义一起使用。例如,在 Java 中,如果您有一个 Map,则键只能是定义的值之一。如果您碰巧从不在定义的值集中的远程客户端/服务器收到枚举键值,则无法将其放入 Map 中。这种限制迫使我们删除具有未知枚举键的映射条目(这违反了proto3开放枚举语义),或者不允许枚举作为映射键。
参考: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