Сравнение буферов протокола Google - PullRequest
24 голосов
/ 12 июля 2010

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

Есть идеи?

Ответы [ 6 ]

26 голосов
/ 02 сентября 2015

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

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

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

MessageDifferencer::Equals(msg1, msg2);

8 голосов
/ 11 августа 2016

Вы можете положиться на тот факт, что все ваши сообщения 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());
}
8 голосов
/ 20 октября 2011

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

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

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

0 голосов
/ 01 февраля 2012

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

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

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

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

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

0 голосов
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...