Порядок элементов в поле карты protobuf - PullRequest
1 голос
/ 03 марта 2020

У меня есть много полей карты, определенных в моих сообщениях буфера протокола. Сообщения заполняются в C ++ и принимаются в другом компоненте C ++, который считывает их содержимое с помощью API Descriptor и Reflection.

Для данного поля карты, скажем:

map <int32, int32> my_map = 1;

Это передается таким же образом, как-то так:

message my_map_entry {
  int32 key = 1;
  int32 value = 2;
}
repeated my_map_entry my_map = 1;

Поскольку я понял текущее ограничение API Descriptor и Reflection, здесь я должен выполнить поиск, перебирая полученные данные. Конечно, я мог бы поместить все данные в более подходящую структуру данных, такую ​​как std::unordered_map, если бы я хотел сделать много поисков в полученном поле карты, но я обычно только один раз смотрю на полученное поле карты.

Могу ли я предположить что-то о порядке получения данных? Возможно, упорядочены повторяющиеся сообщения my_map_entry из-за используемой структуры данных, используемой в реализации буфера протокола? Если это так, поиск целочисленного ключа на карте может остановиться, когда будет найден больший ключ. Это может дать мне потенциальную оптимизацию, когда дело доходит до обработки полученных полей карты в моем приложении.

1 Ответ

1 голос
/ 03 марта 2020

Вы не можете предполагать, что порядок карты после сериализации аналогичен.

Следующая цитата взята с сайта protobuf :

Формат провода упорядочение и итерация карты упорядочение значений карты не определено, поэтому вы не можете полагаться на то, что элементы вашей карты находятся в определенном порядке

В общем случае protobuf может сериализовать поля в случайном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...