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

前端之家收集整理的这篇文章主要介绍了c – 如何将消息解析为DynamicMessage类,然后通过字段进行迭代?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我想弄清楚的,他们的文档不能很好地解释这一点,至少对我而言……

塞纳里奥:

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

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

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

看起来我应该通过“–descriptor_set_out”和动态消息类来实现.

我试过的(和失败的):

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

我不知道从哪里开始.

Here’s what i’ve referenced,although there isn’t much…
对于长篇文章和有些模糊的主题命名架构感到抱歉.

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

解决方法

最常见的方法是使用消息组合.就像是:
message Foo {...}
message Bar {...}
message GenericMessage {
    enum Type {FOO = 1,BAR = 2};
    optional Foo foo = 1;
    optional Bar bar = 2;
}

如果确保每个GenericMessage中都存在Foo或Bar中的一个,则可以获得所需的行为.您读取了一个GenericMessage,然后将其作为几个特定消息之一进行处理.

考虑重构协议.如果你需要做的只是遍历字段,也许你会更喜欢像一个简单的键值映射:

message ValueMessage {
    required string key = 1;
    optional int IntValue = 2;
    optional string StringValue = 3;
    optional bool BoolValue = 4;
    ...
}
message GenericMessage{
    repeated ValueMessage = 1;
}

或者也许你可以通过其他方式重构协议.

猜你在找的C&C++相关文章