为什么 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)
我希望我序列化和解析时没有缺失值,但是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)