在我的服务器上,我们收到自我描述的消息(定义在这里......顺便说一句,这并不是那么容易,因为在 c++ 中没有任何“好的”例子)。
在这一点上,我从这些自我描述的消息中创建消息没有问题。我可以使用 FileDescriptorSet,遍历每个FileDescriptorProto,将每个添加到 DescriptorPool(使用BuildFile,它也给了我每个定义的 FileDescriptor)。
从这里我可以创建在 FileDescriptorSet 中定义的任何消息,其中使用 DP 实例化的 DynamicMessageFactory 并调用GetPrototype(这很容易做到,因为我们的 SelfDescribedMessage 需要消息 full_name(),因此我们可以调用FindMessageTypeByName方法DP,给我们正确编码的消息原型)。
问题是如何获取每个已定义的描述符或消息并动态构建一个“主”消息,其中包含所有已定义消息作为嵌套消息。这主要用于保存消息的当前状态。目前我们只是通过在服务器中实例化每条消息的一种类型来处理这个问题(以保持不同程序的中心状态)。但是当我们想要“保存”当前状态时,我们被迫将它们流式传输到此处定义的磁盘。它们一次流式传输一条消息(带有大小前缀)。我们希望有一条消息(一条来统治所有消息)而不是稳定的单独消息流。一旦解决,这可以用于其他事情(基于网络的共享状态,经过优化且易于序列化)
由于我们已经有了交叉链接和定义的描述符,人们会认为有一种简单的方法可以从那些已经定义的消息中构建“新”消息。到目前为止,解决方案已经暗示了我们。我们已经尝试创建自己的 DescriptorProto 并从我们已经定义的描述符中添加新的类型字段,但是迷路了(还没有深入研究这个)。我们还研究了可能将它们添加为扩展(目前未知如何这样做)。我们是否需要创建自己的DescriptorDatabase(目前也不知道怎么做)?
有什么见解吗?
BitBucket 上的链接示例源。
希望这个解释会有所帮助。
我正在尝试从一组已定义的消息中动态构建消息。已经定义的消息集是通过使用官方 c++ protobuf 教程中解释(简要)的“自我描述”方法创建的(即这些消息以编译形式不可用)。这个新定义的消息需要在运行时创建。
已尝试对每条消息使用直接描述符并尝试构建 FileDescriptorProto。尝试查看 DatabaseDescriptor 方法。两者都没有运气。当前尝试将这些定义的消息作为扩展添加到另一条消息(即使在编译时这些定义的消息,并且它们的“描述符集”未被归类为扩展任何内容),这是示例代码开始的地方。