2011-02-03 6 views
20

errores Deserilization de .NET son bastante genérico, por ejemplo, algo como esto:¿Cómo depurar errores de deserialización en .NET?

System.ArgumentException: Objeto del tipo 'System.Uri' no se puede convertir al tipo 'System.String'.

Está claro que hemos cambiado el tipo de una propiedad en un objeto, pero no son como 10-15 clases diferentes de este objeto serializado, por lo que es muy difícil averiguar cuál hemos cambiado o que practican ensuciado esto .

¿Hay alguna forma de obtener información sobre qué propiedad en qué clase (o al menos en qué clase) realmente está causando este error? ¿Hay alguna herramienta externa o formas conocidas de hacer esto?

P.S. Antes de que alguien empiece a decirme por qué no debería usar el serializador binario o por qué debería usar X, Y, etc. para compatibilidad con versiones anteriores, guarde los consejos sobre eso. Soy consciente de todos esos pero esa no es la pregunta.

+4

¿vio InnerException si usted no tiene más información? – DesignFirst

+0

10-15 no suena como un gran número para depuración; No conozco una manera fácil de depurar ese –

+0

off-hand @Marc Gravell: creo que @dr.mal significa que la instancia que se está deserializando tiene referencias a otras 10-15 clases distintas, todas las cuales (incluida la raíz) pueden tener propiedades 'N' (incluso con una clase, tienes' N' propiedades) que es indeterminada, por lo que potencialmente puede ser una gran cantidad de propiedades para atravesar. – casperOne

Respuesta

1

Hay un par de cosas diferentes que puede hacer, ninguna de ellas excelente. Especialmente con la serialización binaria. Puede agregar un manejo de serialización personalizado con la interfaz ISerializable, que le permitirá pasar por el proceso de deserialización en el depurador.

¿Ha considerado cambiar a la serialización Xml para fines de desarrollo/depuración? Hay algunos ganchos más que puede usar con la serialización Xml. Pero parece que eso no funcionará para ti, ya que probablemente estés lidiando con una interfaz remota o con datos binarios anteriores almacenados en el disco que necesitas leer.

Pero aún más fácil sería mirar a través de los registros del sistema de control de origen el método con el tipo cambiado.

+0

Actualmente estamos en el proceso de verificar la versión anterior para solucionar el problema, sin embargo, esperaba encontrar una herramienta inteligente para ayudarme. Tal vez cuando le doy mi DLL puede deserilizar y visualizar el objeto. Demasiado optimista, ¿eh? :) –

+0

Sí, hay muchos lugares donde las excepciones de .Net contienen poca o ninguna información. Vergüenza real. Las clases de Configuración también arrojan algunos mensajes de excepción muy crípticos cuando tienes clases personalizadas. Al menos sabes que es un cambio de tipo, que te da una buena ventaja. – MonkeyWrench

8

Si habilita la depuración en el código de la estructura (vea el enlace this) y luego presione ctrl + shift + e y seleccione todas las excepciones de código administrado, el error aparecerá en la línea fuente real que falla. Debería poder usar el seguimiento de la pila y luego descubrir qué parte del objeto intentaba deserializar en ese punto.

No es fácil, pero así es como terminamos haciéndolo.

+0

Agregar excepciones de primera oportunidad y usar símbolos como se indicó anteriormente es un gran enfoque. –

+0

OK, esto suena como una gran idea, voy a verificar esto. –

1

En cuanto a la huella de la pila interna puede ser útil. El serializador genera una clase específicamente para manejar el tipo que desea serializar/deserializar.

Con solo mirar los nombres de las funciones involucradas en la pila, puede rastrear qué nodo nodo se está rompiendo.

Esto ayuda a reducir el problema, especialmente con grandes archivos XML complejos.

Ejemplo:

at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at System.Xml.XmlConvert.ToInt32(String s) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read13_Item(Boolean isNullable, Boolean checkType) //Tells you the issue is on the RootNodeSubNodeSubSubNode on an item withing it. 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read17_RootNodeSubNodeSubSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read26_RootNodeSubNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read50_RootNode(Boolean isNullable, Boolean checkType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read51_RootNode() 
+2

cómo saber a qué atributo estaba accediendo. Estoy obteniendo La cadena de entrada no estaba en el formato correcto. Tengo un gran archivo xml que tiene muchos atributos. Quiero saber cuál causó el problema – Ziggler

Cuestiones relacionadas