Подтвердить что ты не робот

Сравнение буферов протоколов Google

Я хочу сравнить два Сообщения или (два подпараметра) буферов протокола Google. Я не нахожу API для его достижения.

Любые идеи?

4b9b3361

Ответ 1

Для этого вы можете использовать класс google:: protobuf:: util:: MessageDifferencer. Я думаю, что он доступен только с v3.0.2:

Представлены новые служебные функции/классы в google/protobuf/util Каталог:

  • MessageDifferencer: сравнивайте два прото-сообщения и сообщайте о своих различиях.

MessageDifferencer::Equals(msg1, msg2);

Ответ 2

Вместо использования message.DebugString вы также можете сделать

std::string strMsg;
message.SerializeToString(&strMsg);

с обоими сообщениями, а затем сравнить две (двоичные) строки. Я не тестировал производительность, но я предполагаю, что это быстрее, чем сравнение прочитанных человеком строк сообщений, возвращаемых .DebugString(). + Вы можете сделать это с помощью библиотеки protobuf-lite (в то время как для message.DebugString вам нужна полная версия).

Ответ 3

Вы можете положиться на то, что все ваши сообщения protobuf наследуются от типа google::protobuf::MesageLite, который, в свою очередь, имеет все необходимое для сравнить любые два сообщения protobuf, независимо от того, имеют ли они один и тот же производный тип:

bool operator==(const google::protobuf::MessageLite& msg_a,
                const google::protobuf::MessageLite& msg_b) {
  return (msg_a.GetTypeName() == msg_b.GetTypeName()) &&
      (msg_a.SerializeAsString() == msg_b.SerializeAsString());
}

Ответ 4

Это может быть не идеальное решение, но я думаю, что это можно сделать:

messageA.DebugString() == messageB.DebugString();

Кроме этого, я думаю, единственным решением было бы создать ваш собственный дочерний класс Message и реализовать bool operator==(const Message&).

Ответ 5

Ну, буфер протокола - это просто формат сериализации для некоторого типа объекта. Почему бы не использовать буфер протокола для восстановления исходных объектов, а затем позволить этим объектам сравнивать себя, используя любую логику сравнения, встроенную в класс?

Ответ 6

Вы можете сравнить указатель дескриптора (супер быстрый):

if (mMessages[i]->body()->GetDescriptor() == T::descriptor())

mMessages представляет собой пул сетевых сообщений с заголовком и криптограммой, который создает пакет с телом protobuf (google:: protobuf:: Message *).

поэтому, чтобы получить правильный вид сообщения, я сравниваю указатель константы указателя, который является одинаковым для каждого отдельного типа сообщения (а не% 100, но у меня пока нет проблем).

Это был бы самый быстрый способ сравнить сообщение protobuf, не использующее сравнение строк, которое, кстати, вы получите имя типа из дескриптора.: -)