这是我想弄清楚的,他们的文档不能很好地解释这一点,至少对我而言……
塞纳里奥:
我有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; }
或者也许你可以通过其他方式重构协议.