Protobuf 不会序列化默认值

Tay*_* Yi 6 python protocol-buffers

我正在为 python 使用 Protobuf。

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

例如,

这是我的 .proto 文件对象

message Test{

    optional string lol = 1 [default="HI"];
    optional int32 num = 2 [default=200];
}
Run Code Online (Sandbox Code Playgroud)

我跑

test = packets_pb2.Test()
print(test.num)
print(test.SerializeToString())
Run Code Online (Sandbox Code Playgroud)

并为 print(test.num) 获得 200 但对于 SerializeToString() 没有结果(空)

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

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

提前致谢。

Fra*_*ney 8

对于使用 Protobuf 3 的任何人,有一种方法可以使用or的including_default_value_fields参数序列化默认值:MessageToDictMessageToJson

from google.protobuf.json_format import MessageToJson

serialized_message_with_defaults = MessageToJson(
    protobuf_instance,
    including_default_value_fields=True,  # this does it
)
Run Code Online (Sandbox Code Playgroud)


Ken*_*rda 6

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

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