如何将消息解析为DynamicMessage类,然后通过字段进行迭代?

bgu*_*ura 7 c++ protocol-buffers

这是我想弄清楚的,他们的文档不能很好地解释这一点,至少对我而言......

塞纳里奥:

我有5个原型文件,我使用protoc for C++生成.我的应用程序需要接收消息,然后能够在访问其值和名称时遍历所有字段.

我想要做的是将消息解析到DynamicMessage类中,然后通过字段进行迭代.这样我就不必确切地知道它是什么消息,我可以用一种通用的方式处理它们.

我知道可以通过将消息解析为特定类型来处理消息,然后将它们视为消息基类,但对于我的应用程序来说是不可取的.

看起来我应该通过"--descriptor_set_out"和动态消息类来实现.

我试过的(和失败的):

我将descriptor.proto移动到我的protos文件夹中,并在编译步骤中将其包含在我的其他文件夹中.我还设置了 - descriptor_set_out标志来打印到文件"my_descriptors.pb.ds"

我不知道从哪里开始.

这是我引用的内容,虽然没有太多... 对于长篇文章抱歉,有点模糊的主题命名架构.

此外,如果不清楚,我认为消息不是"未知".我假设仍然需要为每个原型包含相应的标题,因此我的代码知道它处理的"未知"消息.

Tad*_*ski 0

最常见的方法是使用消息组合。就像是:

message Foo {...}
message Bar {...}
message GenericMessage {
    enum Type {FOO = 1, BAR = 2};
    optional Foo foo = 1;
    optional Bar bar = 2;
}
Run Code Online (Sandbox Code Playgroud)

如果您确保每个FooBar中恰好存在一个GenericMessage,您就会得到所需的行为。您阅读其中一条消息GenericMessage,然后将其作为几条特定消息之一进行处理。

考虑重构协议。如果您需要做的只是迭代字段,也许您最好使用简单的键值映射之类的东西:

message ValueMessage {
    required string key = 1;
    optional int IntValue = 2;
    optional string StringValue = 3;
    optional bool BoolValue = 4;
    ...
}
message GenericMessage{
    repeated ValueMessage = 1;
}
Run Code Online (Sandbox Code Playgroud)

或者也许你可以用其他方式重构你的协议。