Как использовать API ReportModified () с Google Protobuf MessageDifferencer? - PullRequest
0 голосов
/ 10 мая 2019

Мне нужно вычислить разницу между двумя объектами 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) должны быть полезны.

...