2010-07-12 4 views

Répondre

-1

Cela pourrait ne pas être la solution idéale, mais je pense que cela pourrait se faire par:

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

Autre que cela, je pense que la seule solution serait de créer votre propre classe enfant Message et mettre en œuvre un bool operator==(const Message&) .

+0

+1 belle essayer :) En fait, j'ai besoin d'être rapide – dimba

+0

@idimba Tks. Mais alors je suppose que vous devriez éditer votre question et mentionner la chose de vitesse ;-). Mais alors, je suppose, la seule vraie option serait de mettre en œuvre l'opérateur de comparaison vous-même. – Gianni

+0

+1 pour l'opérateur ==, c'est la bonne façon de faire .. – Yousf

0

Eh bien, un tampon de protocole est juste un format de sérialisation pour un type d'objet. Pourquoi ne pas utiliser le tampon de protocole pour reconstruire les objets originaux, puis permettre à ces objets de se comparer, en utilisant la logique de comparaison que vous avez construite dans la classe?

8

Au lieu d'utiliser message.DebugString vous pouvez aussi faire

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

avec les deux messages, puis de comparer les deux chaînes (binaires). Je n'ai pas testé la performance mais je suppose qu'elle est plus rapide que la comparaison des chaînes de caractères lisibles par un humain retournées par .DebugString(). + Vous pouvez le faire avec la librairie protobuf-lite (alors que pour le message.DebugString vous avez besoin de la version complète).

+1

La sérialisation n'est pas garantie pour être cohérente entre les binaires et dans le temps. Par exemple, les extensions inconnues d'un binaire seront sérialisées en dernier (en tant que champs inconnus), après les extensions connues. La sérialisation dépend donc des descripteurs disponibles au moment de la sérialisation. Comparer les messages sérialisés est donc un mauvais moyen de vérifier l'égalité. MessageDifferencer est la bonne façon de le faire. –

-3

Vous pouvez comparer le pointeur du descripteur (super rapide):

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

mMessages c'est un pool de messages de réseau avec en-tête et Crypto qui crée un paquet avec le corps de protobuf (Google :: protobuf :: Message *). Donc, pour obtenir le bon type de message, je compare le pointeur constant des descripteurs qui est le même pour chaque type de message (pas 100% sûr mais je n'ai pas de problème jusqu'à maintenant). Ce serait le moyen le plus rapide de comparer un message protobuf sans avoir à utiliser la comparaison de chaînes, ce qui vous permettra d'obtenir le nom du type à partir du descripteur. :-)

+0

J'adore comment ma réponse a été rejetée, mais c'est la bonne façon de comparer les messages. – KukoBits

+5

Ce serait correct si vous vouliez comparer les types, mais cette question semblerait porter sur la comparaison du contenu, ce qui n'est certainement pas le cas. C'est pourquoi vous avez obtenu la downvote, je le garantis. –

17

Vous pouvez utiliser la classe google::protobuf::util::MessageDifferencer pour cela. Je pense qu'il est uniquement disponible depuis v3.0.2:

Introduit de nouvelles fonctions utilitaires/classes dans le répertoire google/protobuf/util :

  • MessageDifferencer: comparer deux messages Prototypes et rendre compte de leurs différences.

MessageDifferencer::Equals(msg1, msg2);

+1

Pour ajouter: MessageDifferencer est disponible pour C++ seulement – deddebme

+0

selon que les champs de vos types de message peuvent avoir des valeurs par défaut, vous pouvez considérer 'MessageDifferencer :: Equivalent' au lieu de' Equals' – pestophagous

4

Vous pouvez compter sur le fait que tous vos messages protobuf héritent du type google::protobuf::MesageLite, ce qui a tout ce que vous devez comparer deux messages protobuf, quel que soit si elles sont même du même type dérivé:

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()); 
} 
+0

Wow. Cela devrait être une réponse parfaite à la question de cet utilisateur! Bravo! – Peaches491

Questions connexes