2011-07-12 18 views
9

En nuestra aplicación Cliente/Servidor, hemos estado utilizando BinaryFormatter para el proceso de serialización. Por razones de rendimiento, estamos intentando migrar a protobuf-net (http://code.google.com/p/protobuf-net/).¿Cómo comparar dos gráficos de objetos .NET para las diferencias?

Nuestro software transmite gráficos enormes con ciclos entre Cliente y Servidor.

Ahora estoy buscando una forma de asegurarme de que los datos que se serializaron y deserializaron usando protobuf son exactamente los mismos que usó BinaryFormatter.

Una comparación poco a poco es simple: serializo usando BinaryFormatter a un archivo. Deserializar este archivo nuevamente utilizando BinaryFormatter. Luego serializo usando ProtoBuf en un archivo. Deserializar utilizando ProtoBuf desde ese archivo. Serializar de nuevo usando BinaryFormatter en un archivo.

Entonces simplemente puedo comparar ese archivo con el archivo original.

Sin embargo, esos dos archivos no son 100% iguales. Entonces ahora necesito encontrar una manera de rastrear las diferencias.

¿Existe alguna herramienta que visualice datos serializados por BinaryFormatter? ¿O conoces algún otro ayudante que haga una comparación profunda y me diga dónde están las diferencias?

El uso de XMLSerializer y la comparación de dos archivos XML no es posible ya que BinaryFormatter es capaz de serializar mucho más datos que XMLSerializer, incluso sin marcar campos explícitamente.

Gracias, TH

+0

Tengo un montón de código aquí en SO para comparar objetos individuales, pero comparar un gráfico completo es ... complicado. Si tuviera que * adivinar *, me preguntaría si hay pequeñas diferencias de precisión con fecha y hora. –

+0

Hola Marc. Si los archivos fueran casi idénticos, diría lo mismo. Sin embargo, me falta aproximadamente el 25% de los datos. Ahora me pregunto si, por ejemplo, las referencias a las instancias se compartieron aunque no deberían (porque las referencias originales no apuntaban al mismo objeto) o si simplemente olvidé agregar ciertos campos a TypeModel. Alguna herramienta sería genial, simplemente traza todo el gráfico del objeto a un gráfico legible por humanos (similar a lo que hace http://ignatu.co.uk/ViewStateDecoder.aspx (sin embargo, ese algoritmo no funciona con nuestros enormes gráficos)) – TwinHabit

Respuesta

5

Cómo sobre el uso DataContractSerializer con el rastreo de objetos habilitada (preserveObjectReferences en el constructor). Eso debería le permiten serializarlos a xml (de un tipo, al menos), donde podría ser capaz de comparar las diferencias.

+0

Gran idea. Lo intentaré. Por cierto, acabo de encontrar una gran diferencia que es consecuencia del manejo de referencia fallido. El problema aquí es que el objeto que estamos serializando ya es una lista. Sin embargo, no encontré la posibilidad en su API de especificar que el seguimiento de referencias esté habilitado para este objeto de nivel superior. Solo sé que es posible habilitarlo en Miembros. Entonces, una solución sería proporcionar una clase de contenedor para la colección y habilitar el Rastreo de Referencia en la colección contenida. Pero habilitarlo en el objeto de nivel superior sería más suave. ¿Eso ya es posible? – TwinHabit

+0

@TwinHabit no sin cambios significativos, me temo que los búferes de protocolo no tienen ninguna noción de * la lista como objeto *, lo que conduce a una serie de rarezas. Solo * sabe sobre elementos. Básicamente, en el cable se obtiene "padre hijo hijo hijo niño" - nunca "padre lista niño hijo niño" (si ves lo que quiero decir) –

+0

Tal vez podríamos mejorar la biblioteca mediante una característica que mueve transparentemente objetos de tipos de lista personalizados para crear clases de contenedores creadas dinámicamente? Eso resolvería dos problemas: uno podría transportar fácilmente campos con listas personalizadas, así como activar el seguimiento de referencia en el objeto de lista de nivel superior. El problema que estamos teniendo ahora es que tendremos que cambiar las interfaces cliente/servidor porque algunos métodos solo devuelven listas ... pero veamos. Quizás pueda persuadirlos. – TwinHabit

5

Tuvimos el mismo problema. Nosotros Json serializamos los dos objetos (con formato, sangría, nuevas líneas, etc.) y luego usamos una diferencia de texto simple. Te dirá no solo que son diferentes, sino cuál es la diferencia.

Cuestiones relacionadas