Google protocol buffers comparer
Je veux comparer deux Messages ou (deux sous paramètres) de Google protocol buffers.
Je ne trouve pas d'API pour l'atteindre.
Des idées?
- Pouvez-vous préciser ce qu'est exactement que vous souhaitez comparer: structure du message, le message de valeurs de champ ou les deux à la fois?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser la classe google::protobuf::util::MessageDifferencer pour cela. Je pense qu'il est uniquement disponible depuis v3.0.2:
MessageDifferencer::Equals(msg1, msg2);
MessageDifferencer::Equivalent
au lieu deEquals
Vous pouvez compter sur le fait que l'ensemble de vos protobuf messages d'hériter de la
google::protobuf::MesageLite
type, qui à son tour a tout ce dont vous avez besoin pour comparer deux protobuf messages, indépendamment de s'ils sont du même type dérivé:MessageDifferencer::Equals(msg1, msg2);
Au lieu d'utiliser
message.DebugString
vous pouvez également faire deavec les deux messages, puis de comparer les deux (binaire) les chaînes de caractères. Je n'ai pas tester les performances, mais je suppose qu'il est plus rapide que de comparer les lisible par l'homme des chaînes de message renvoyé par .DebugString(). +Vous pouvez le faire avec le protobuf-lite bibliothèque (alors que pour le message.DebugString vous avez besoin de la version complète).
Bien, un protocole de tampon est juste un format de sérialisation pour certains type d'objet. Pourquoi ne pas utiliser le protocole de la mémoire tampon pour reconstruire les objets d'origine, et ensuite permettre à ces objets, à se comparer, à l'aide de quelque logique de comparaison que vous avez construit dans la classe?
Cela pourrait ne pas être la solution idéale, mais je pense qu'il pourrait être fait par:
Autre que cela, je pense que la seule solution serait de créer votre propre
Message
enfant de la classe et de mettre en œuvre unbool operator==(const Message&)
.Vous pouvez comparer le descripteur du pointeur (super rapide):
mMessages c'est un bassin de réseau les messages d'en-tête et le crypto qui crée un paquet avec le protobuf corps(google::protobuf::Message*).
donc, pour obtenir le bon type de message que j'ai comparer les descripteurs de pointeur constant qui est le même pour chaque type de message (pas de 100% sûr, mais je n'ai pas de problème jusqu'à présent).
Qui serait le moyen le plus rapide pour comparer un protobuf Message wthout avoir à utiliser des chaînes de caractères comparasion, qui, par la façon dont vous gan obtenir le nom du type du descripteur. 🙂