Как исправить ошибку «При синтаксическом анализе сообщения протокола неожиданно завершился ввод в середине поля» - PullRequest
0 голосов
/ 08 февраля 2019

Получение InvalidProtocolBufferException: во время синтаксического анализа сообщения протокола ввод неожиданно завершился в середине поля.ошибка при синтаксическом анализе Protobuf

Не знаю, почему не удается выполнить синтаксический анализ, хотя я могу видеть выходные данные, если вызываю метод response.getContentAsString () для объекта ответа.

мой файл Proto:

syntax = "proto2";
package  com.test.protocol;

option java_package = "com.test.protocol.v1";
option java_outer_classname = "Test1";

message Test2 {
    required int64 id                  = 1;
    required string value               = 2
}

Я написал API для возврата ответа Proto, который выглядит следующим образом

final Test2.Builder builder = TEST2.newBuilder();
builder.setId(1);
builder.setValue("1");
return builder.build();

Мой API вернет следующий вывод

{"id": 1,"value": "1"}

Я пытаюсь вызвать API ипроанализируйте его обратно в Test2, как показано ниже

import com.test.protocol.v1.Test1.Test2;

final Test2 result = Test2.parseFrom(response.getContentAsByteArray());

получая ошибку на предыдущем шаге Если я отлаживаю и пытаюсь напечатать response.getContentAsString (), я получаю правильный вывод, как показано ниже, но синтаксический анализ не выполняется.

{"id": 1,"value": "1"}

1 Ответ

0 голосов
/ 09 июля 2019

Для вашего сообщения сериализованная форма должна иметь следующие 5 байтов 08-01-12-01-31. 1 Метод parseFrom(byte[]) предполагает такую ​​кодировку.Когда вы даете ему JSON, он неправильно интерпретирует символы в строке и завершается ошибкой.Например, '{' означает запуск группы (эта функция устарела) с тегом 15.

Я предполагаю, что вы используете веб-фреймворк.Вы предоставляете сообщение protobuf для ответа на сервере, и платформа отправляет представление JSON клиенту.

Чтобы клиент мог использовать представление JSON, можно использовать следующий код.

JsonFormat.parser().merge(theJsonString, Test2.newBuilder())

Конечно, тогда вы не "используете protobuf".Вместо этого вы просто используете сгенерированные протобуфом классы.


  1. Для получения дополнительной информации о кодировке см. Документацию и попробуйте декодер .
...