Почему protobuf пропускает некоторые параметры, когда в Python равно 0? - PullRequest
0 голосов
/ 25 сентября 2019

Я ожидаю, что при сериализации и синтаксическом анализе отсутствует пропущенное значение, но у версии Protoc 3.9.2 есть проблема.

Протофайл показан ниже:

syntax = "proto3";
package example;
message person {
    int32 id = 1;
    string name = 2;
}
message all_person {
    repeated person Per = 1;
}

, когда яустановить id = 0, name = 'hello', я ожидаю показать "id": 0, но после SerializeToString и parseToString он возвращает


{
  "Per": [
    {
      "name": "hello"
    }
  ]
}

, но если я установил id = 1, name = 'привет ', возвращается

{
  "Per": [
    {
      "id": 1,
      "name": "hello"
    }
  ]
}

1 Ответ

0 голосов
/ 25 сентября 2019

Ноль - это значение по умолчанию для чисел (аналогично, строки по умолчанию пустые, логические значения ложные).См. здесь для получения более подробной информации.

Для эффективности Protobuf использует эти значения по умолчанию.В нашей системе (используя FastRTPS и Protobuf для pub / sub) значения по умолчанию не передаются по проводам.Исходя из того, что вы видите, он не беспокоится о них для сериализации.

Однако это только поведение по умолчанию и может быть изменяемым.Например, если вы используете MessageToJson, вы можете просто установить для необязательного параметра including_default_value_fields значение True, заявив, что вы также хотите выводить значения по умолчанию:

jsonStr = MessageToJson(myMsg, True)
...