Protobuf 不序列化默认值

Protobuf doesn't serialize default values

我正在为 python 使用 Protobuf。

我一直在尝试使用默认值,但每次我 运行 SerializeToString() 我什么都得不到。

例如,

这是我的 .proto 文件对象

message Test{

    optional string lol = 1 [default="HI"];
    optional int32 num = 2 [default=200];
}

我运行

test = packets_pb2.Test()
print(test.num)
print(test.SerializeToString())

并得到 打印 200(test.num) 但 SerializeToString()

没有结果(空)

我希望我的默认值被序列化。

知道如何完成这项工作吗?

提前致谢。

这是按预期工作的。默认值不会在线上发送。相反,接收端假设如果一个字段不存在,那么它应该使用默认值。通过不发送公共值,这节省了 space。这确实意味着客户端和服务器必须就默认值达成一致;您通常不应更改 .proto 文件中的默认值。

请记住,默认值的主要目的是能够处理来自在该字段存在之前构建的旧客户端的消息。因此,这些客户端显然无法在线发送默认值,因为他们对此一无所知。

对于使用 Protobuf 3 的任何人,有一种方法可以使用 MessageToDictMessageToJson:

including_default_value_fields 参数序列化默认值
from google.protobuf.json_format import MessageToJson

serialized_message_with_defaults = MessageToJson(
    protobuf_instance,
    including_default_value_fields=True,  # this does it
)