bgu*_*ura 7 c++ protocol-buffers
这是我想弄清楚的,他们的文档不能很好地解释这一点,至少对我而言......
塞纳里奥:
我有5个原型文件,我使用protoc for C++生成.我的应用程序需要接收消息,然后能够在访问其值和名称时遍历所有字段.
我想要做的是将消息解析到DynamicMessage类中,然后通过字段进行迭代.这样我就不必确切地知道它是什么消息,我可以用一种通用的方式处理它们.
我知道可以通过将消息解析为特定类型来处理消息,然后将它们视为消息基类,但对于我的应用程序来说是不可取的.
看起来我应该通过"--descriptor_set_out"和动态消息类来实现.
我试过的(和失败的):
我将descriptor.proto移动到我的protos文件夹中,并在编译步骤中将其包含在我的其他文件夹中.我还设置了 - descriptor_set_out标志来打印到文件"my_descriptors.pb.ds"
我不知道从哪里开始.
这是我引用的内容,虽然没有太多... 对于长篇文章抱歉,有点模糊的主题命名架构.
此外,如果不清楚,我认为消息不是"未知".我假设仍然需要为每个原型包含相应的标题,因此我的代码知道它处理的"未知"消息.
最常见的方法是使用消息组合。就像是:
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)
如果您确保每个Foo或Bar中恰好存在一个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)
或者也许你可以用其他方式重构你的协议。