Использование карт в protobuf v2 - PullRequest
0 голосов
/ 08 мая 2018

В настоящее время я использую Protobuf версии 2 в моем проекте. Пока что все сообщения работают отлично; однако я наткнулся на блокпост, пытаясь использовать ключевое слово map.

Использование TLDR, связанное с необходимостью карты, заключается в том, что я хочу передать некоторые пары ключ / значение JSON на мой сервер, чтобы выполнить поиск, и потенциальный журнал данных на сервер (который использует интерфейс сообщений JSON).

В настоящее время я использую метод обратной совместимости, рекомендованный на странице документов: https://developers.google.com/protocol-buffers/docs/proto#maps

Я хотел бы понять, почему следующее объявление моего сообщения (с использованием карт) не может быть скомпилировано? Я использую следующую версию компилятора protoc: '# protoc --version => libprotoc 2.6.1'

message MapFieldEntry {
  optional string key = 1;
  optional string value = 2;
}

message Lookup {
  repeated MapFieldEntry map_field = 1;
  map<string, string> test_map = 2;
}

Я получаю следующую ошибку (ошибки не имеют смысла для меня, учитывая документацию по функции карты):

Expected "required", "optional", or "repeated".
Expected field name.

Я попытался добавить синтаксис = "proto2"; вверху, но я все еще получаю ошибку.

Edit: Просто как записка; проблема, которую я имею, касается второго аргумента сообщения поиска. Первый аргумент - это то, что я сейчас использую для обхода.

1 Ответ

0 голосов
/ 08 мая 2018

Я нашел кого-то еще с похожей проблемой в git: https://github.com/google/protobuf/issues/799

Ответ:

Синтаксис карт поддерживается только начиная с версии 3.0.0. "Proto2" в документе имеется в виду синтаксическая версия, а не версия protobuf версия. v3.0.0 поддерживает как синтаксис proto2, так и синтаксис proto3, а v2.6.1 поддерживает только синтаксис proto2. Для всех пользователей рекомендуется используйте v3.0.0-beta-1 вместо v2.6.1.

Похоже, что для решения вашей проблемы вы должны использовать protoc 3 вместо 2.6.1.

И держите ваш syntax=proto2 в верхней части файла, чтобы уточнить, что это синтаксис proto2, который вы используете.

Не могли бы вы попытаться дать мне знать, если это работает? это интересный вопрос, так как официальный документ не упоминает об этом.

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