gpt4 book ai didi

c++ - 如何从一组已定义的描述符中动态构建新的 protobuf?

转载 作者:IT老高 更新时间:2023-10-28 12:49:02 24 4
gpt4 key购买 nike

在我的服务器上,我们收到 self 描述的消息(定义为 here ...顺便说一句,这并不容易,因为在 c++ 中没有任何“好的”示例)。

在这一点上,我从这些 self 描述的消息中创建消息没有问题。我可以拿FileDescriptorSet,遍历每一个FileDescriptorProto ,将每个添加到 DescriptorPool(使用 BuildFile ,这也给了我每个定义的 FileDescriptor)。

从这里我可以创建在 FileDescriptorSet 中定义的任何消息,其中 DynamicMessageFactory 使用 DP 实例化并调用 GetPrototype (这很容易做到,因为我们的 SelfDescribedMessage 需要消息 full_name(),因此我们可以调用 DP 的 FindMessageTypeByName 方法,为我们提供正确编码的消息原型(prototype))。

问题是如何获取每个已定义的描述符或消息并动态构建一个“主”消息,其中包含所有已定义消息作为嵌套消息。这主要用于保存消息的当前状态。目前我们只是通过在服务器中实例化每条消息的一种类型来处理这个问题(以保持不同程序的中心状态)。但是当我们想要“保存”当前状态时,我们不得不按照定义将它们流式传输到磁盘here。 .它们一次流式传输一条消息(带有大小前缀)。我们希望有一条消息(一条来统治所有消息)而不是稳定的单独消息流。一旦解决,这可以用于其他事情(基于网络的共享状态,经过优化且易于序列化)

由于我们已经有了交叉链接和定义的描述符,人们会认为有一种简单的方法可以从那些已经定义的消息中构建"new"消息。到目前为止,解决方案已经暗示了我们。我们已经尝试创建自己的 DescriptorProto 并从我们已经定义的描述符中添加新的类型字段,但是迷路了(还没有深入研究这个)。我们还研究了可能将它们添加为扩展(目前未知如何这样做)。我们需要创建自己的DescriptorDatabase (目前也不知道该怎么做)?

有什么见解吗?


已链接 example source在 BitBucket 上。


希望这个解释会有所帮助。

我正在尝试从一组已定义的消息中动态构建消息。已经定义的消息集是通过使用官方 c++ protobuf 教程中解释(简要)的“ self 描述”方法创建的(即这些消息以编译形式不可用)。这个新定义的消息需要在运行时创建。

已尝试对每条消息使用直接描述符并尝试构建 FileDescriptorProto。尝试查看 DatabaseDescriptor 方法。两者都没有运气。当前尝试将这些定义的消息作为扩展添加到另一条消息(即使在编译时这些定义的消息,并且它们的“描述符集”未被归类为扩展任何内容),这是示例代码开始的地方。

最佳答案

你需要一个 protobuf::DynamicMessageFactory:

{
using namespace google;

protobuf::DynamicMessageFactory dmf;
protobuf::Message* actual_msg = dmf.GetPrototype(some_desc)->New();

const protobuf::Reflection* refl = actual_msg->GetReflection();

const protobuf::FieldDescriptor* fd = trip_desc->FindFieldByName("someField");
refl->SetString(actual_msg, fd, "whee");

...

cout << actual_msg->DebugString() << endl;
}

关于c++ - 如何从一组已定义的描述符中动态构建新的 protobuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com