Невозможно закодировать файл .proto в двоичный файл, используя не определенные типы компилятора протокола.

Я пытаюсь преобразовать файл proto в двоичный файл для полезной нагрузки HTTP-запроса, однако я получаю сообщение об ошибке от инструмента компилятора protoc, возвращающий тип, не определенный. Мне не удалось найти никакой документации по определениям типов, используемых вместе с --encode =.

Я пробовал указывать разные типы в --encode, но информация, которую я нашел, не имела отношения к делу. Я также пытался указать прототип сообщения из файла .proto "` message DeviceAuthRequest {}

protoc --encode=projname.auth TEST.proto > TEST.bin
Type not defined: projname.auth 
protoc --encode=DeviceAuthRequest TEST.proto > TEST.bin

Каковы фактические типы для --encode и --decode? У меня есть исходный код и скомпилированный код на C #. Ищете способ создания полезной нагрузки с измененными данными в прото-файле.


person Dmitriy    schedule 17.10.2019    source источник
comment
Я запутался ... Вы говорите, что у вас есть C # ... Разве вы не можете просто загрузить (деаэриализовать) данные, используя сгенерированный код C #, изменить данные как объекты и снова сериализовать их ?   -  person Marc Gravell    schedule 18.10.2019
comment
Вместо того, чтобы изменять сгенерированный код C #, я бы предпочел использовать файлы протоколов, поскольку мне нужно будет часто вносить изменения в параметры в нескольких файлах .proto. protoc --encode=[package].[message] test.proto > test.bin Мне удалось выполнить протокол без ошибок типа сообщения, однако после выполнения протокол зависал без создания двоичного файла.   -  person Dmitriy    schedule 18.10.2019
comment
но вы пытаетесь изменить только данные, верно? вам не нужно изменять сгенерированные файлы вообще; вы бы просто написали о трех строках, которые десериализуются, мутируют и сериализуются; я неправильно понял вопрос?   -  person Marc Gravell    schedule 18.10.2019
comment
Это правильно, это вопрос изменения фактических данных, чтобы обеспечить отправку правильно отформатированных полезных данных в API в соответствии с прото-файлами. У меня есть доступ только к API, принимающему сообщения protobuf, а не к клиентскому приложению, отправляющему сообщения, поэтому я буду генерировать свои собственные данные и соответствующим образом изменять их.   -  person Dmitriy    schedule 18.10.2019
comment
Я пробую следующее, что по-прежнему дает мне ошибки синтаксического анализа, не совсем уверен, что я ошибся с форматом. Получение следующего: input: 1: 12: Ожидаемый идентификатор, получено: 5eb94f9c-ee3e-476a-ada9-4a84cf72ff28. Не удалось проанализировать ввод. `protoc --encode packagetest.demo demo.proto < demo.txt > demo.bin DemoIds: {"5eb94f9c-ee3e-476a-ada9-4a84cf72ff28"} SentTimeUtc: "2019-10-18T17:15:00Z" ContextId: 123123123 файл демонстрации прототипа message demo { repeated UserGuid DemoIds = 1; google.protobufTimestamp SentTimeUtc = 2; int32 ContextId = 3}   -  person Dmitriy    schedule 19.10.2019


Ответы (1)


Я не знаю, о какой схеме прото вы имеете в виду, но синтаксис должен выглядеть примерно так (пример генерации идентификаторов оператора связи под Android с protoc версией 3.6.1):

cat carrier_list.textpb | protoc --encode=carrierIdentification.CarrierList -I/home/osboxes/Documents/ carrierId.proto > test.pb

Я не вижу никаких данных в вашем примере. protoc считывает ввод из стандарта, поэтому вам нужно передать некоторые данные, например с помощью команды cat. Я тоже не вижу включений. Вы должны передать include с -I, где ищутся прото-файлы. Это также отсутствует в ваших примерах. Используйте здесь абсолютный путь, если у вас возникнут проблемы.

Файл carrierId.proto выглядит так

syntax = "proto2";

package carrierIdentification;

option java_package = "com.android.internal.telephony";
option java_outer_classname = "CarrierIdProto";

// A complete list of carriers
message CarrierList {
  // A collection of carriers. one entry for one carrier.
  repeated CarrierId carrier_id = 1;
  // Version number of current carrier list
  optional int32 version = 2;
};

Итак, при повторном воспроизведении прото-файла вы должны использовать. (Точка) .carrierIdentification.CarrierList.

person k_o_    schedule 08.12.2019