sigsegv Использование MessageDifferencer в прото-сообщениях - PullRequest
0 голосов
/ 04 августа 2020

Я новичок, пытаюсь использовать Google protobuf для рабочего проекта. Я хочу выяснить разницу между сообщениями protobuf и, следовательно, попытаться использовать API MessageDifferencer. Я получаю SEGV при запуске кода ниже. Комментируя строку «репортер-> ReportModified (* Obj1, * Obj2, field_path);» не приводит к segv. Любая помощь в использовании разницы приветствуется!

google::protobuf::util::MessageDifferencer diff;
diff.set_report_matches(false);
diff.set_report_moves(false);
std::string reportDiff;
google::protobuf::io::StringOutputStream* opstream = new google::protobuf::io::StringOutputStream(&reportDiff);
google::protobuf::util::MessageDifferencer::StreamReporter* reporter =  new google::protobuf::util::MessageDifferencer::StreamReporter(opstream);
diff.ReportDifferencesTo(reporter);

std::vector<google::protobuf::util::MessageDifferencer::SpecificField> field_path;
try
{
    reporter->ReportModified(*Obj1, *Obj2, field_path);
}
catch (const std::exception& e)
{
    std::cout << e.what() <<"\n";
}

cout << __func__ << " Report added " << field_path.size();

//Cleanup objects
delete Obj1; 
delete Obj2;
delete reporter;

Спасибо, Мэдди

1 Ответ

0 голосов
/ 06 августа 2020

Вы не должны вызывать метод ReportModified напрямую, класс MessageDifferencer вызывает его, когда обнаруживает разницу.

MessageDifferencer::Compare - это правильный метод для вызова, согласно документы . Предполагая, что все остальное правильно, я считаю, что изменение вашего кода внутри try-l oop для вызова должно сработать.

Перемещая свой код в функцию, вы можете получить что-то вроде

std::string CompareMessages(
    const google::protobuf::Message& m1,
    const google::protobuf::Message& m2) {
  using google::protobuf::util::MessageDifferencer;

  MessageDifferencer diff;
  diff.set_report_matches(false);
  diff.set_report_moves(false);
  std::string reportDiff;
  {
    google::protobuf::io::StringOutputStream opstream(&reportDiff);
    MessageDifferencer::StreamReporter reporter(&opstream);
    diff.ReportDifferencesTo(&reporter);

    diff.Compare(m1, m2);
  }
  return std::move(reportDiff);
}
...