#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;
}
Используйте сообщение расширения, чтобы найти поле расширения, затем используйте базовое сообщение, чтобы установить / получить значение поля расширения.