我有一个由.NET代码序列化的protobuf文件,我想将其用Java消费。在.NET代码中,有Dictionary数据类型,proto模式看起来像这样:
正如在stackoverflow帖子Protocol Buffers中的字典中所描述的那样。
我可以使用protoc将proto文件编译成Java类。我可以成功地将protobuf文件反序列化为Java对象。唯一的问题是,它在Java中被转换为Pair对象的List而不是HashMap。当然,我仍然拥有所有数据,但我无法像我希望的那样高效地访问数据。如果我有键的值,我必须遍历整个列表才能获得其相应的值。这似乎不是最优的方法。
我想知道是否有更好的方法来建模protobuf中的Dictionary/Map数据类型。
谢谢 更新: 我尝试了Jon Skeet的建议,在addressbook示例中添加了map类型字段,但仍然遇到了问题。
根据Google protobuf文档,proto 2确实支持map类型https://developers.google.com/protocol-buffers/docs/proto#maps。正如我引用的那样,
message Pair {
optional string key = 1;
optional string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
正如在stackoverflow帖子Protocol Buffers中的字典中所描述的那样。
我可以使用protoc将proto文件编译成Java类。我可以成功地将protobuf文件反序列化为Java对象。唯一的问题是,它在Java中被转换为Pair对象的List而不是HashMap。当然,我仍然拥有所有数据,但我无法像我希望的那样高效地访问数据。如果我有键的值,我必须遍历整个列表才能获得其相应的值。这似乎不是最优的方法。
我想知道是否有更好的方法来建模protobuf中的Dictionary/Map数据类型。
谢谢 更新: 我尝试了Jon Skeet的建议,在addressbook示例中添加了map类型字段,但仍然遇到了问题。
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
map<string, string> mapdata = 5;
}
编译时,协议出现错误。
addressbook.proto:25:3: Expected "required", "optional", or "repeated".
addressbook.proto:25:6: Expected field name.
根据Google protobuf文档,proto 2确实支持map类型https://developers.google.com/protocol-buffers/docs/proto#maps。正如我引用的那样,
所以我真的不知道为什么protoc无法编译它。这里还有另一个讨论have to create java pojo for the existing proto includes Map。答案表明map只是proto 3的一个特性。这与谷歌的文档相矛盾。Maps不能是可重复的、可选的或必需的。