为什么 protobuf 在 python 中等于 0 时会丢失一些参数?

Why does protobuf miss some params when equals to 0 in python?

我希望我序列化和解析时没有缺失值,但是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 之后,它 returns


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

但如果我设置 id=1,name='hello',它 returns

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

零是数字的默认值(类似地,字符串默认为空,布尔值默认为假)。有关详细信息,请参阅 here

为了提高效率,Protobuf 依赖于这些默认值。在我们的系统中(使用 FastRTPS 和 Protobuf pub/sub),默认值不会通过线路传输。根据您所看到的,它也不担心它们的序列化。

但是,这只是默认 行为,可能会发生变化。例如,如果您使用 MessageToJson,您可以简单地将可选参数 including_default_value_fields 设置为 True,声明您也想要默认输出:

jsonStr = MessageToJson(myMsg, True)