Protocol buffers Protobuf3:如何描述重复字符串的映射?
报告说:Protocol buffers Protobuf3:如何描述重复字符串的映射?,protocol-buffers,protocol-buffers-3,Protocol Buffers,Protocol Buffers 3,报告说: map\u字段=N …其中键类型可以是任何整型或字符串类型(因此,任何 标量类型(浮点类型和字节除外)。值类型 可以是任何类型 我想定义一个map字段,但在我的libprotoc 3.0.0上它似乎是非法的,它抱怨预期“>”。所以我想知道是否有任何方法可以将重复的字符串放入地图中 一个可能的解决办法是: message ListOfString { repeated string value = 1; } // Then define: map<string, List
map\u字段=N代码>
…其中键类型可以是任何整型或字符串类型(因此,任何
标量类型(浮点类型和字节除外)。值类型
可以是任何类型
我想定义一个map
字段,但在我的libprotoc 3.0.0
上它似乎是非法的,它抱怨预期“>”
。所以我想知道是否有任何方法可以将重复的字符串放入地图中
一个可能的解决办法是:
message ListOfString {
repeated string value = 1;
}
// Then define:
map<string, ListOfString> mapToRepeatedString = 1;
消息列表字符串{
重复字符串值=1;
}
//然后定义:
映射映射重复字符串=1;
但是ListOfString
在这里看起来是多余的 我也有同样的需求,也犯了同样的错误。我认为这是不可能的。以下是语言规范中的相关BNF定义
messageType=[“]{ident.”}messageName
mapField=“map”“”mapName”=“fieldNumber[”[“fieldOptions”]”];”
type=“double”|“float”|“int32”|“int64”|“uint32”|“uint64”
|“sint32”|“sint64”|“fixed32”|“fixed64”|“sfixed32”|“sfixed64”
|“bool”|“string”|“bytes”| messageType | enumType
messageName=ident
ident=字母{字母|小数位数|“”}
字段=[“重复”]类型字段名“=”字段号[“[”字段选项“]”];“
“重复”关键字仅出现在字段定义中。地图定义需要一个“类型”,它不包括重复的关键字
这意味着有几个选择
-
您可以按照指示围绕重复值创建一个包装器。
- 人们定义地图的方式比较旧,这更麻烦,但也相当于。这是《语言指南》中向后兼容的示例。
https://developers.google.com/protocol-buffers/docs/proto3#maps
消息映射字段条目{
键\类型键=1;
重复值\类型值=2;
}
重复MapFieldEntry map_field=N;
您需要自己将数据转换为映射,但在大多数语言中这应该是相当简单的。在Java中:
List<MapFieldEntry> map_field = // Existing list from protobuf.
Map<key_type, List<value_type>> = map_field.stream()
.collect(Collectors.toMap(kv -> kv.key, kv -> kv.value));
列表映射\字段=//protobuf中的现有列表。
Map=Map\u field.stream()
.collect(收集器.toMap(kv->kv.key,kv->kv.value));
-
使用google.protobuf.ListValue
这是来自其已知类型的非类型列表集合。
我认为应该如下
message ListOfString {
repeated string what_ever_name = 1;
}
// Then define:
map<string, ListOfString> what_ever_name = 1;
消息列表字符串{
重复字符串what\u ever\u name=1;
}
//然后定义:
映射什么\u ever\u name=1;
请记住,两个地方的名称都应该相同。只需检查基本内容:)您是否设置了syntax=“proto3”代码>?我很好奇Protobuf为什么既有“ListValue”又有“repeated”。它们的作用不一样吗?“ListValue”上的即时文档有点稀疏。为什么what\u ever\u name
的字段名在两个位置都需要相同?这不是一种完全独立的类型吗?@BigMoney它不一定是。我想这就是这个例子的布局。
List<MapFieldEntry> map_field = // Existing list from protobuf.
Map<key_type, List<value_type>> = map_field.stream()
.collect(Collectors.toMap(kv -> kv.key, kv -> kv.value));
message ListOfString {
repeated string what_ever_name = 1;
}
// Then define:
map<string, ListOfString> what_ever_name = 1;