Является ли карта обратно совместимой с повторяющейся парой значений ключа?

#protocol-buffers #protobuf-java

#буферы протокола #protobuf-java

Вопрос:

Могу ли я использовать

 message Foo {
  map<string, string> foo = 1;
}
  

вместо

 message Foo {
  repeated KeyValuePair foo = 1;
}

message KeyValuePair {
  string key = 1;
  string value = 2;
}
  

?

Первый источник находится в proto3, а второй — в proto2.

Ответ №1:

Пока у вас нет дубликатов ключей, они будут очень похожи. Если у вас есть дубликаты ключей, использование карты будет иметь другое поведение, поскольку duplicatws вызовет либо перезапись, либо исключение (я не могу вспомнить, что, извините). Кроме того, «повторяющийся» обычно реализуется в виде списка / массива / etc, так что: порядок сохраняется. «карта» обычно реализуется с помощью какой-либо структуры карты / словаря, где порядок не обычно гарантируется.

Итак: если порядок не имеет значения и у вас всегда есть уникальные ключи: все в порядке.

Комментарии:

1. Итак, если я клиент, использующий версию proto3, разговаривающий с сервером, использующим версию proto2, и я отправляю карту, со мной все будет в порядке?

2. @Soren они совместимы с проводами, так что да, пока упомянутые мной 2 предостережения не являются проблемами. Кстати, я все равно думал, что «map» теперь перенесен в proto2. Но поведение — это то, что имеет значение, а именно: как указано выше