Я хочу сравнить два Сообщения или (два подпараметра) буферов протокола Google. Я не нахожу API для его достижения.
Любые идеи?
Я хочу сравнить два Сообщения или (два подпараметра) буферов протокола Google. Я не нахожу API для его достижения.
Любые идеи?
Для этого вы можете использовать класс google:: protobuf:: util:: MessageDifferencer. Я думаю, что он доступен только с v3.0.2:
Представлены новые служебные функции/классы в google/protobuf/util Каталог:
- MessageDifferencer: сравнивайте два прото-сообщения и сообщайте о своих различиях.
MessageDifferencer::Equals(msg1, msg2);
Вместо использования message.DebugString
вы также можете сделать
std::string strMsg;
message.SerializeToString(&strMsg);
с обоими сообщениями, а затем сравнить две (двоичные) строки. Я не тестировал производительность, но я предполагаю, что это быстрее, чем сравнение прочитанных человеком строк сообщений, возвращаемых .DebugString(). + Вы можете сделать это с помощью библиотеки protobuf-lite (в то время как для message.DebugString вам нужна полная версия).
Вы можете положиться на то, что все ваши сообщения 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());
}
Это может быть не идеальное решение, но я думаю, что это можно сделать:
messageA.DebugString() == messageB.DebugString();
Кроме этого, я думаю, единственным решением было бы создать ваш собственный дочерний класс Message
и реализовать bool operator==(const Message&)
.
Ну, буфер протокола - это просто формат сериализации для некоторого типа объекта. Почему бы не использовать буфер протокола для восстановления исходных объектов, а затем позволить этим объектам сравнивать себя, используя любую логику сравнения, встроенную в класс?
Вы можете сравнить указатель дескриптора (супер быстрый):
if (mMessages[i]->body()->GetDescriptor() == T::descriptor())
mMessages представляет собой пул сетевых сообщений с заголовком и криптограммой, который создает пакет с телом protobuf (google:: protobuf:: Message *).
поэтому, чтобы получить правильный вид сообщения, я сравниваю указатель константы указателя, который является одинаковым для каждого отдельного типа сообщения (а не% 100, но у меня пока нет проблем).
Это был бы самый быстрый способ сравнить сообщение protobuf, не использующее сравнение строк, которое, кстати, вы получите имя типа из дескриптора.: -)