Как найти тип сообщения по имени атрибута в сообщении google proto buf? - PullRequest
1 голос
/ 22 мая 2019

У меня есть сообщения 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;
}

Вывод: Тип: строка Тип: message

Тем не менее, я хочу получить фактический тип сообщения "ConfigMsg" вместо просто"сообщение".Есть ли какой-либо такой API, доступный от protobuf?

Я тщательно проверил эту страницу https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#FileDescriptor.name.details, но не смог найти ничего полезного для этого.

Если кто-то совершил подобное или знает что-то об этом, это было бы полезно.

Спасибо,

1 Ответ

0 голосов
/ 26 мая 2019

Я получил некоторую подсказку от другой группы, и я мог бы написать код на 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
...