gpt4 book ai didi

python - 如何在 Protobuf 中序列化嵌套消息中的默认值

转载 作者:太空宇宙 更新时间:2023-11-03 20:35:18 27 4
gpt4 key购买 nike

正如标题所述,我有一条 protobuf 消息,其中包含另一条消息,如下所示:

syntax = "proto3";

message Message
{
message SubMessage {
int32 number = 1;
}

SubMessage subMessage = 1;
}

我的 example.json 为空(这意味着到处都有默认值):

{
}

在我的 python 脚本中,我读到了这条消息:

example_json = open("example.json", "r").read()

example_message = example.Message()
google.protobuf.json_format.Parse(example_json, example_message)

当我检查 example_message.subMessage.number 的值时,它是 0,这是正确的。

现在我想将其转换为一个字典,其中存在所有值 - 甚至是默认值。对于转换,我使用 google.protobuf.json_format.MessageToDict() 方法。但您可能知道,如果没有我告诉它, MessageToDict() 不会序列化默认值(就像这个问题: Protobuf doesn't serialize default values )。因此,我将参数 include_default_value_fields=True 添加到 MessageToDict() 的调用中:

protobuf.MessageToDict(example_message, including_default_value_fields=True)

返回:

{}

而不是我所期望的:

{'subMessage': {'number': 0}}

protobuf 代码中的注释(可在此处找到: https://github.com/protocolbuffers/protobuf/blob/master/python/google/protobuf/json_format.py )证实了此行为:

including_default_value_fields: If True, singular primitive fields,repeated fields, and map fields will always be serialized. IfFalse, only serialize non-empty fields. Singular message fieldsand oneof fields are not affected by this option.

那么我该怎么做才能获得包含所有值的字典,即使它们是嵌套消息中的默认值?

<小时/>

有趣的是,当我的 example.json 看起来像这样时:

{
"subMessage" : {
"number" : 0
}
}

我得到了预期的输出。但我无法确保 example.json 会写出所有值,因此这不是一个选项。

最佳答案

基于Looping over Protocol Buffers attributes in Python的回答我创建了一个自定义 MessageToDict 函数:

def MessageToDict(message):
message_dict = {}

for descriptor in message.DESCRIPTOR.fields:
key = descriptor.name
value = getattr(message, descriptor.name)

if descriptor.label == descriptor.LABEL_REPEATED:
message_list = []

for sub_message in value:
if descriptor.type == descriptor.TYPE_MESSAGE:
message_list.append(MessageToDict(sub_message))
else:
message_list.append(sub_message)

message_dict[key] = message_list
else:
if descriptor.type == descriptor.TYPE_MESSAGE:
message_dict[key] = MessageToDict(value)
else:
message_dict[key] = value

return message_dict

鉴于从空 example.json 读取的消息,此函数返回:

{'subMessage': {'number': 0}}

关于python - 如何在 Protobuf 中序列化嵌套消息中的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57203347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com