Protobuf игнорирует значения bool и ints по умолчанию

Я конвертирую файл json в строку, а затем строка преобразуется в файл proto3.

Вот файл json:

{    "a": false,
     "b": 0
}

Вот как я конвертирую свой json-файл в строку:

String json =Files.lines(Paths.get(filePath)).collect(Collectors.joining());

Вот как я конвертирую свою строку в файл proto3:

    JsonFormat.parser().ignoringUnknownFields().merge(json,messageBuilder);
   MyProto proto = messageBuilder.build();

У меня есть поля boolean и int в моем json, значения некоторых из них должны быть значениями по умолчанию (false для boolean и 0 для int).

Когда я десериализую указанный выше файл в java-файл proto3, оба вышеуказанных поля игнорируются, и мой json становится пустым, хотя я явно установил значения (как вы можете видеть в приведенном выше json файле).

Я знаю, что proto3 игнорирует значения по умолчанию при десериализации / сериализации, однако есть ли способ не игнорировать поля, которые явно установлены, даже если они являются значениями по умолчанию?


person Manas Saxena    schedule 11.07.2018    source источник


Ответы (2)


Использовал proto2 вместо proto3. Proto2 имеет такое поведение - если поле явно задано, даже если это значение поля по умолчанию, оно сериализуется и десериализуется.

person Manas Saxena    schedule 15.07.2018

Нет, в руководстве по языку Protobuf прямо указано, что это невозможно:

Обратите внимание, что для скалярных полей сообщения после анализа сообщения невозможно определить, было ли поле явно установлено на значение по умолчанию (например, было ли установлено значение false для логического значения) или просто не установлено вообще: вы должны указать это в помните при определении типов сообщений. Например, не используйте логическое значение, которое включает какое-либо поведение, если установлено значение false, если вы не хотите, чтобы это поведение также происходило по умолчанию. Также обратите внимание, что если для поля скалярного сообщения установлено значение по умолчанию, значение не будет сериализовано в сети.

Если вам действительно нужно знать, было ли значение по умолчанию установлено явно или нет, вы закодировали эту информацию в отдельном поле.

person gmolau    schedule 12.07.2018
comment
Или используйте Int32Value или StringValue и т. Д. - person Jon Skeet; 12.07.2018