#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. Но поведение — это то, что имеет значение, а именно: как указано выше