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;