C++ google protobuf:如何从扩展的 FieldDescriptor 创建 MutableExtension

Posted

技术标签:

【中文标题】C++ google protobuf:如何从扩展的 FieldDescriptor 创建 MutableExtension【英文标题】:C++ google protobuf: How to create MutableExtension from extension's FieldDescriptor 【发布时间】:2019-04-23 02:29:19 【问题描述】:

我有一个包含扩展的消息的原型

message MsgA

    extensions 10 to 50;

我有另一个具有扩展的原型(仅显示下面的扩展之一)

extend MsgA

    optional MsgB msgB = 10;

message MsgB

    required int32 value = 1;

通过 protobuf 代码,我可以获取 MsgB 的描述符和 FileDescriptor,并且可以从那里检索 FieldDescriptor 类型的扩展名“msgB”。我正在通过 protobuf 代码找到扩展,而不是使用从 MsgB proto 生成的代码,因为我试图遍历所有扩展消息,而不是将它们中的每一个硬编码到 MutableExtension 中。 (我理解 MutableExtension(MsgB::msgB) 的硬编码方式,但想使用检索到的扩展名)

我想用 msgB 扩展填充 MsgA 的可变扩展,但 MutableExtension 接受一种

(const ::google::protobuf::internal::ExtensionIdentifier& id) 或

(const ::google::protobuf::internal::ExtensionIdentifier& id, int index)

如何使用找到的 msgB 扩展填充/创建 MutableExtension,或者如何创建 msgB 的 ExtensionIdentifer 以用作创建 MsgA 的 MutableExtension 的输入?

【问题讨论】:

【参考方案1】:

我想我找到了一种通过反射将扩展扩展到 MsgA 的方法。

在 MsgA 对象上,检索反射对象。然后在反射对象上使用 MsgA 对象和扩展 FieldDescriptor 对象调用 MutableMessage(FileDescriptor 对象来自定义扩展名的 GetDescriptor()->file(),在这种情况下为 MsgB)。

MsgA* msgObj;
FieldDescriptor* ext = fileDescriptor->extension(indexOfExtension);
auto reflection = msgObj->GetReflection();
reflection->MutableMessage(msgObj, ext);

这将使用扩展消息填充 MsgA 对象,您可以按索引遍历每个扩展,以使用每个扩展消息填充 MsgA 对象。

【讨论】:

以上是关于C++ google protobuf:如何从扩展的 FieldDescriptor 创建 MutableExtension的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 Google 协议缓冲区:从现有结构创建消息

谷歌出品:Protobuf 你知道吗?

C++ 中的 Google ProtoBuf 与 C# (UDP) 中的 Protobuf-net 聊天

无法使用 Google 的 protobuf 构建测试 C++ 应用程序

C++ 使用 google Protobuf 2 和 protobuf3 依赖项?

protobuf 详解