2010-07-12 14 views

Respuesta

-1

esto podría no ser la solución ideal, pero creo que se podría hacer por:

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

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

+0

+1 buen intento :) En realidad, necesito que sea rápido – dimba

+0

@idimba Tks. Pero entonces supongo que deberías editar tu pregunta y mencionar la velocidad ;-). Pero entonces, supongo, la única opción real sería implementar usted mismo el operador de comparación. – Gianni

+0

+1 para el operador ==, esta es la forma correcta de hacerlo .. – Yousf

0

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, usando la lógica de comparación que hayas incorporado a la clase?

8

En lugar de utilizar message.DebugString también se puede hacer

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

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

+1

No se garantiza que la serialización sea consistente en los binarios y en el tiempo. Por ejemplo, las extensiones que son desconocidas para un binario se serializarán en último lugar (como campos desconocidos), después de las extensiones conocidas. Entonces la serialización dependerá de qué descriptores estén disponibles en el momento de la serialización. La comparación de los mensajes seriados es, por lo tanto, malo, verificar la igualdad. MessageDifferencer es la forma correcta de hacerlo. –

-3

Puede comparar el puntero del descriptor (súper rápido):

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

mMessages Es un conjunto de mensajes de red con cabecera y cripto que crea un paquete con el cuerpo protobuf (Google :: protobuf :: Mensaje *)

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

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

+0

Me encanta cómo mi respuesta fue rechazada, pero es la forma correcta de comparar mensajes. – KukoBits

+5

Eso sería correcto si quisiera comparar los tipos, pero esta pregunta parece ser sobre la comparación de los contenidos, lo que ciertamente no hace. Esta es la razón por la que obtuviste el voto negativo, lo justifico. –

17

Puede usar la clase google::protobuf::util::MessageDifferencer para esto. Creo que es sólo está disponible desde v3.0.2:

introducido nuevas funciones de utilidad/clases en el/ directorio de Google/protobuf util:

  • MessageDifferencer: compara dos mensajes proto e informar de sus diferencias.

MessageDifferencer::Equals(msg1, msg2);

+1

Para agregar: MessageDifferencer está disponible solo para C++ – deddebme

+0

dependiendo de si los campos en sus tipos de mensajes pueden tener valores predeterminados, es posible que desee considerar 'MessageDifferencer :: Equivalent' en lugar de' Equals' – pestophagous

4

Usted puede confiar en el hecho de que todos los mensajes protobuf heredan de la clase google::protobuf::MesageLite, que a su vez cuenta con todo lo necesario para comparar dos mensajes protobuf, independientemente de si son incluso 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()); 
} 
+0

Wow. ¡Esta debería ser la respuesta perfecta a la pregunta de este usuario! ¡Bravo! – Peaches491

Cuestiones relacionadas