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

时间:2019-09-25 03:36:24

标签: python-3.x protocol-buffers

我希望序列化和解析时不会丢失任何值,但是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 ='hello',它将返回

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

1 个答案:

答案 0 :(得分:0)

0是数字的默认值(类似地,字符串默认为空,布尔值为false)。有关更多详细信息,请参见here

为了提高效率,Protobuf依靠这些默认值。在我们的系统中(使用FastRTPS和Protobuf进行发布/订阅),默认值不会通过网络传输。根据您所看到的,它也不必担心它们进行序列化。

但是,这只是默认行为,并且可以更改。例如,如果您使用的是MessageToJson,则可以简单地将一个可选参数including_default_value_fields设置为True,说明您也希望使用默认输出:

jsonStr = MessageToJson(myMsg, True)