Мне нужно вычислить разницу между двумя объектами protobuf одного типа.т.е. разница между значениями атрибутов каждого объекта, поэтому я планирую использовать API ReportModified (), предоставляемый буферами протокола Google.
У меня есть приведенный ниже код для тестирования функциональности API ReportModified.Я просмотрел документацию, представленную на, но не смог выяснить причину этого сбоя.
У меня возникла проблема при использовании этого и возникла ошибка SIGSEGV.
Я написал небольшую функциюкак показано ниже, чтобы проверить эту функциональность.
bool compare_gpb()
{
ConfigMsg *cfgMsg1 = new ConfigMsg();
CfgServerMsg serverMsg1;
cfgMsg1->set_msgid(100);
cfgMsg1->set_cfgname("obj1");
for (int j = 1; j < 3; j++) {
/* Fill some repeated fields */
}
serverMsg1.set_allocated_cfgmsg(cfgMsg1);
ConfigMsg *cfgMsg2 = new ConfigMsg();
CfgServerMsg serverMsg2;
cfgMsg2->set_msgid(100);
cfgMsg2->set_cfgname("obj1");
for (int j = 1; j < 3; j++) {
/* Fill some repeated fields */
}
serverMsg2.set_allocated_cfgmsg(cfgMsg2);
MessageDifferencer msgDiff;
msgDiff.set_report_matches(true);
msgDiff.set_report_moves(true);
msgDiff.set_scope(MessageDifferencer::FULL);
std::string diffReport;
std::string output;
StringOutputStream output_stream(&output);
MessageDifferencer::StreamReporter reporter(&output_stream);
reporter.set_report_modified_aggregates(false);
msgDiff.ReportDifferencesToString(&diffReport);
msgDiff.ReportDifferencesTo(&reporter);
std::cout << "Result is:" << msgDiff.Compare(serverMsg1, serverMsg2) << std::endl;
std::cout << "The Differences are:" << output << std::endl;
std::vector<MessageDifferencer::SpecificField> path;
const CfgServerMsg &message1(serverMsg1);
const CfgServerMsg &message2(serverMsg2);
reporter.ReportModified(message1, message2, path);
std::cout << "The ReportModified size " << path.size() << std::endl;
}
Я вижу, что ReportModified аварийно завершает работу со стеком вызовов ниже.
(gdb) bt
#0 google::protobuf::util::MessageDifferencer::StreamReporter::PrintValue (
this=0x7ffdea175c20, message=warning: RTTI symbol not found for class 'cfg::CfgServerMsg'
..., field_path=std::vector of length 0, capacity 0,
left_side=true) at google/protobuf/util/message_differencer.cc:1787
#1 0x00000000004fd0df in google::protobuf::util::MessageDifferencer::StreamReporter::ReportModified (this=0x7ffdea175c20, message1=warning: RTTI symbol not found for class 'cfg::CfgServerMsg'
..., message2=warning: RTTI symbol not found for class 'cfg::CfgServerMsg'
...,
field_path=std::vector of length 0, capacity 0)
at google/protobuf/util/message_differencer.cc:1900
#2 0x00000000004b13b4 in compare_gpb() ()
#3 0x00000000004b171f in main ()
(gdb)
В нем должны отображаться поля / атрибуты, которые были изменены в сообщении 2.
Любойпомощь в том, как двигаться дальше, следующие шаги или пример кода, чтобы узнать больше?На самом деле подробности o любой API отчета *** (ReportAdded, ReportMove, ReportDeleted) должны быть полезны.