protocol protobuf google buffers c++ protocol-buffers

c++ - protobuf - Comparacion de buffers de protocolo de Google



protobuf python (6)

Quiero comparar dos mensajes o (dos parámetros secundarios) de los buffers de protocolo de Google . No encuentro una API para lograrlo.

¿Algunas ideas?


Bueno, un búfer de protocolo es solo un formato de serialización para algún tipo de objeto. ¿Por qué no usar el búfer de protocolo para reconstruir los objetos originales y luego permitir que esos objetos se comparen a sí mismos, usando la lógica de comparación que hayas incorporado en la clase?


En lugar de usar message.DebugString también podrías hacer

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

con ambos mensajes y luego comparar las dos cadenas (binarias). No probé el rendimiento, pero asumo que es más rápido que comparar las cadenas de mensajes legibles por humanos devueltas por .DebugString (). + Puede hacerlo con la biblioteca protobuf-lite (mientras que para message.DebugString necesita la versión completa).


Esta podría no ser la solución ideal, pero creo que podría hacerse de la siguiente manera:

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

Aparte de eso, creo que la única solución sería crear su propia clase secundaria de Message e implementar un bool operator==(const Message&) .


Puede confiar en el hecho de que todos sus mensajes de protobuf heredan del tipo google::protobuf::MesageLite , que a su vez tiene todo lo que necesita para comparar cualquiera de los dos mensajes de protobuf, sin importar si son del mismo tipo derivado:

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


Puedes comparar el puntero del descriptor (super rápido):

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

mMessages es un conjunto de mensajes de red con encabezado y criptografía que crea un paquete con el cuerpo protobuf (google :: protobuf :: Message *).

Entonces, para obtener el tipo correcto de mensaje, comparo los descriptores del puntero constante, que es el mismo para cada tipo de mensaje (no estoy seguro, pero no tengo ningún problema hasta ahora).

Esa sería la forma más rápida de comparar un Mensaje protobuf sin tener que usar la comparación de cadenas, que por la forma en que puede obtener el nombre del tipo del descriptor. :-)


Puedes usar la clase google::protobuf::util::MessageDifferencer para esto. Creo que solo está disponible desde v3.0.2 :

Se introdujeron nuevas funciones / clases de utilidad en el directorio google / protobuf / util:

  • MessageDifferencer: compara dos proto mensajes y reporta sus diferencias.

MessageDifferencer::Equals(msg1, msg2);