10

这就是我想要弄清楚的,他们的文档解释得不够好,至少对我来说是这样。

塞纳里奥:

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

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

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

看起来我想做的事情应该可以通过“--descriptor_set_out”和动态消息类来实现。

我尝试过的(但失败了):

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

我不知道从那里开始。

这是我引用的内容,尽管没有太多... 对不起,很长的帖子,而且主题命名模式有些模糊。

另外,如果不清楚,我认为这些消息不是“未知”。我认为仍然需要为每个原型包含各自的标头,以便我的代码知道它处理的“未知”消息。

4

2 回答 2

0

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

message Foo {...}
message Bar {...}
message GenericMessage {
    enum Type {FOO = 1, BAR = 2};
    optional Foo foo = 1;
    optional Bar bar = 2;
}

如果您确保每个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;
}

或者,也许您可​​以通过其他方式重构您的协议。

于 2013-06-01T19:52:08.907 回答
0

警告:我的回答并不完全正确我有一些关于冲突的编译错误,我会在修复它时进行编辑:)。但这是一个起点

自发布此问题以来可能已经有很长时间了,但是现在我在使用 Protocol Buffers 时遇到了类似的事情。

首先参考是错误的,必须添加的命令选项是:

--descriptor_set_out=<Directory>

你的descriptor.protoDirectory的编译版本(或描述你的文件的.proto编译版本)位于哪里。

在此之后,您必须在自动描述的 .proto 文件中添加对 Descriptor.proto 文件的引用。

message MyMessage
{
    required google.protobuf.FileDescriptorSet proto_files = 1;
    ...
}
于 2015-06-26T09:18:53.257 回答