如何将多个 protobuf 消息整理到一个对象中

问题描述 投票:0回答:1

我有一条 protobuf 消息,形式为:

message CustomMessage
{
    SubMessageTypeA a_msg = 1;
    SubMessageTypeB b_msg = 2;    
    SubMessageTypeC c_msg = 3;
}

我有几个这种类型的对象(假设 3 个),每个对象都填充了各自的字段之一。 我想在 Python 中将这些对象整理成 1。 这是我未成功使用的代码片段。感谢您帮助找到正确答案:

collated_obj = CustomMessage()
for obj in [obj_1, obj_2, obj_3]:
    for desc in obj.DESCRIPTOR.fields:
        getattr(collated_obj, desc.name).CopyFrom(getattr(obj, desc.name))

我做的东西很脆,一直没起作用。一开始,如果该字段是基本类型(例如 uint32),则 getattr 失败。 除了使用

getattr
之外,有没有办法找到对原型字段的引用?似乎那是我坚持的主要部分。 我可以将所有内容都转换为 json,让生活更轻松。但尽可能避免重复转换和序列化/反序列化。

python descriptor proto3 protobuf-python
1个回答
0
投票

您可以使用 MergeFrom() 合并两个 protobuf 消息的内容,这比使用描述符方法容易得多,如果字段是基本类型,则值将被替换,如果它们重复,则将被连接起来。

from custom_message_pb2 import CustomMessage, SubMessageTypeA, SubMessageTypeB, SubMessageTypeC


collated_obj = CustomMessage()
for obj in [obj_1, obj_2, obj_3]:
    collated_obj.MergeFrom(obj)
© www.soinside.com 2019 - 2024. All rights reserved.