Как установить поле расширения сообщения с помощью отражения в протобуфере

#protocol-buffers

#буферы протокола

Вопрос:

Как установить поле расширения сообщения в protobuffer? Код выглядит следующим образом:

 messa&e Header {
    optional strin& name = 1;
    extensions 2 to 10; 
}
messa&e PbDirectiveHeader {
    extend Header {
        optional strin& messa&e_id = 2;
    }
}
  
     PbDirectiveHeader header_ms&;
    std::cout << "header_ms& des : " << header_ms&.GetDescriptor() << std::endl;
    const &oo&le::protobuf::FieldDescriptor* messa&e_id_dec = header_ms&.GetDescriptor()-&&t;FindExtensionByName("messa&e_id");
    if (messa&e_id_dec != nullptr) {
        std::cout << "header_ms& messa&e_id's des containin&_type: " << messa&e_id_dec-&&t;containin&_type() << std::endl;
        header_ms&.GetReflection()-&&t;SetStrin&(amp;header_ms&, messa&e_id_dec, "123456");
        std::cout << "messa&e_id:" << header_ms&.GetReflection()-&&t;GetStrin&(header_ms&, messa&e_id_dec) << std::endl;
    } else {
        std::cout << "header_ms& messa&e_id des is nullptr" << std::endl;
    }
  

сообщение об ошибке является :

 [libprotobuf FATAL &oo&le/protobuf/&enerated_messa&e_reflection.cc:86] Protocol Buffer reflection usa&e error:
...
Problem     : Field does not match messa&e type.
  

Если я использую отражение для установки name поля заголовка сообщения, ошибки нет, но если я перехожу к установке поля расширения messa&e_id , ошибка повторяется. как решить мою проблему?

Ответ №1:

Я нахожу решение для решения своей проблемы

     PbDirectiveHeader header_ms&;
    Header header;
    std::cout << "header_ms& des : " << header_ms&.GetDescriptor() << std::endl;
    const &oo&le::protobuf::FieldDescriptor* messa&e_id_dec = header_ms&.GetDescriptor()-&&t;FindExtensionByName("messa&e_id");
    if (messa&e_id_dec != nullptr) {
        std::cout << "header_ms& messa&e_id's des containin&_type: " << messa&e_id_dec-&&t;containin&_type() << std::endl;
        header.GetReflection()-&&t;SetStrin&(amp;header, messa&e_id_dec, "123456");
        std::cout << "messa&e_id:" << header.GetReflection()-&&t;GetStrin&(header, messa&e_id_dec) << std::endl;
    } else {
        std::cout << "headermessa&e_id des is nullptr" << std::endl;
    }
  

Используйте сообщение расширения, чтобы найти поле расширения, затем используйте базовое сообщение, чтобы установить / получить значение поля расширения.