当前位置: 首页 > 知识库问答 >
问题:

如何从google proto buf消息的属性名称中找到消息类型?

拓拔弘亮
2023-03-14

我有如下定义的protobuf消息。我需要从属性名称中找到消息类型。例如,当输入为“cfgMsg”时,输出应为ConfigMsg或CfgServerMsg。ConfigMsg(全名)。

message CfgServerMsg {
  string name = 1;
  ConfigMsg cfgMsg = 2;
}

message ConfigMsg {
  string cfgName = 1;
  uint32 msgId = 2;
}

我有下面的代码。然而,这适用于定义良好的类型,如string、int、float等,对于消息,它只打印“message”作为输出。

我删除了一些代码,只展示了与这个问题相关的代码。所以这显然不是完整的代码。

google::protobuf::Message *modObj = new ModObj();

const google::protobuf::Descriptor *outModDesc 
            =  modObj->GetDescriptor();
const Reflection *outModRefl = modObj->GetReflection();
const FieldDescriptor *field;

// Loop to iterate over all the fields
{
  field = outModDesc->FindFieldByName(tmp_name);
  std::string type = field->type_name();
  std::cout << "Type:" << type << std::endl;
}

输出:类型:字符串类型:消息

但是,我想获得实际的消息类型,即“ConfigMsg”,而不仅仅是“message”。protobuf是否提供此类API?

我没有检查这个页面https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#FileDescriptor.name.details彻底,但找不到任何有用的东西。

如果有人做过类似的事情或者知道一些关于这个的事情,那将是有用的。

谢谢

共有1个答案

尉迟德惠
2023-03-14

我从另一个小组得到了一些线索,我可以用C编写代码以获得实际的消息类型。在下面发布详细信息以帮助其他人。

google::protobuf::Message *modObj = new ModObj();

const google::protobuf::Descriptor *outModDesc 
            =  modObj->GetDescriptor();
const Reflection *outModRefl = modObj->GetReflection();
const FieldDescriptor *field;

// Loop to iterate over all the fields
{
  field = outModDesc->FindFieldByName(tmp_name);
  std::string type = field->type_name();
  std::cout << "Type:" << type << std::endl;

  outField = outModDesc->FindFieldByName(tmp_name);
  const google::protobuf::Descriptor* tmpDesc = outField->message_type();
  std::string subMsgType = tmpDesc->name();
  std::string fullMsgType = tmpDesc->full_name();
  std::cout << " Type: " << subMsgType
                        << ", Full Type: " << fullMsgType << std::endl;
  }

代码输出:

Type: ConfigMsg, FullType: frrcfg.ConfigMsg
 类似资料:
  • 我昨天让它工作,然后我做了一些事情,现在我一直试图修复它几个小时,我只是无法让它工作了。 我有一个包含

  • 我有两个问题: 问题1:我的消息文件位于web-inf/i18n目录下。它只包含两个文件:messages_en.properties和messages_hr.properties。 如果我尝试运行上面的代码,我会得到警告:“ResourceBundle[messages]not found for MessageSource:不能find bundle for base name message

  • 我最近一直在研究这个Java游戏。我试图用音频剪辑添加音乐,但它不起作用,所以我取出了我的主代码,删除了主代码,因为我不再需要它了。在我实现音乐之前,所有的代码都是一样的,但现在这个消息弹出,不让我运行我的游戏: 错误:在com.Illuminationsco.gonerdgo.entities.markles类中找不到Main方法,请将Main方法定义为:public static void M

  • 主要内容:面试题剖析,解决方案面试题剖析 我举个例子,我们以前做过一个 mysql binlog 同步的系统,压力还是非常大的,日同步数据要达到上亿,就是说数据从一个 mysql 库原封不动地同步到另一个 mysql 库里面去(mysql -> mysql)。常见的一点在于说比如大数据 team,就需要同步一个 mysql 库过来,对公司的业务系统的数据做各种复杂的操作。 你在 mysql 里增删改一条数据,对应出来了增删改

  • 我的任务用例:现在的用例是,我在一个表单中填写名字、姓氏等细节,然后单击Submit按钮,数据直接进入Amazon SQS,然后定义了一个包含按钮的侦听器,单击该按钮,数据从侦听器进入MSSQL数据库。 场景(当前):现在,所有属于不同消息属性的消息都将被发送。 要求:我要发送属于特定消息属性的特定消息。例如:假设A类、B类和C类是三个不同的消息属性,A类包含一个消息,B类包含两个消息,C类包含四

  • 我希望编写一个Azure函数,该函数接收来自IoTHub的消息,并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称将根据我所查看的消息和留档的参数进行更改,例如,将队列名称设置为输出设置的一部分。有人做过类似的事情吗?或者有任何代码示例可以根据传入消息中的值写入队列?我试图设置一个函数,但它甚至不让我设置输出类型为服务总线,而不把队列名称,我不能,因为它是不固定的! 所以如果输入是: 函