2010-02-25 16 views
10

¿Hay alguna herramienta para ayudar a depurar/verificar el proceso de serialización xml?Herramientas para depurar/verificar Serialización XML

Por ejemplo, supongamos que un elemento está marcado como interno en lugar de público. No hay un mensaje de error de tiempo de compilación ni un mensaje de error de tiempo de ejecución. Si establece un punto de interrupción y entra en el proceso de serialización, el elemento simplemente se salta. En otras palabras, a menudo es difícil encontrar este tipo de problemas. Una herramienta de depuración le permitiría avanzar paso a paso en el proceso y proporcionar algunos comentarios, p. encontró este atributo, iterado a través de las propiedades y no encontró uno público correspondiente, omitido. Otra opción sería una herramienta de verificación para examinar todas las clases con atributos de serialización xml para asegurarse de que sean accesibles y tengan métodos establecidos, etc.

+0

Tim, mantener la depuración de la forma en que se encuentra y que no necesitará una herramienta de este tipo dentro de unos meses. –

+0

FWIW, puede depurar en la fuente de .NET si lo desea (está disponible para descargar en alguna parte, lea la licencia antes de hacerlo). Esto es todo lo que sugeriría, si desea ver cómo está funcionando exactamente. –

Respuesta

1

¿Qué quiere decir "un elemento". Si un tipo es interno, debería aparecer un mensaje de error. La excepción más externa no suele ser muy útil, pero se remonta a .InnerException en la parte inferior y generalmente explica exactamente cuál es el problema.

Si un miembro es completamente interno, entonces seguro: se omitirá.

OMI, las pruebas de la unidad/de integración son de su amigo real aquí - la salida deseada de serialización es en última instancia fuera el compilador, por lo que no importa si usted recibe un mensaje de tiempo de compilación si la salida no coincide que esperas. Lo que quiero decir aquí es: hacer la serialización y compararla con un archivo de salida esperado. Ídem entrada.

Por ejemplo, al intentar serializar:

[XmlRoot("Node", Namespace="http://flibble")] 
public class MyType { 
    [XmlElement("chileNode")] 
    public string Value { get; internal set; } 
} 

da (en tiempo de ejecución):

No se puede generar una clase temporal (resultado = 1). CS0200 error: la propiedad o indizador MyType.Value 'no se puede asignar a - que es de sólo lectura

que es bastante específico.

+0

Por ejemplo, una colección de objetos con la colección establecida en interna y el tipo establecido en interno no genera un error de tiempo de compilación o de tiempo de ejecución con el atributo xmlarray en la colección y un xmltype en el tipo de objeto. Se genera un mensaje de error en tiempo de compilación cuando acaba de establecer el ObjectType en interno, pero eso se debe a que la colección tiene un acceso más limitado que el tipo. Como otro ejemplo, un acceso de acceso interno con el atributo XmlAttribute tampoco genera un error. Además, aunque esto es obvio, un conjunto faltante; método no causa un error. – Tim

+0

Solo para aclarar: esto es suponiendo que el archivo xml tiene el formato correcto. Ese es un problema completamente diferente. Tengo que obtener el código para procesar correctamente el formato correcto de xml antes de que pueda abordar xml con formato incorrecto. – Tim

0

No conozco ninguna herramienta existente, pero puede escanear las clases con reflexión. Puede usar la reflexión para ver el código producido por el serializador.

0

Lo que podría hacer aquí es utilizar la herramienta SGen.exe del entorno de MS Visual Studio.

Al ejecutar esta herramienta sobre su conjunto que contiene los tipos de datos que pueden ser redimensionados, genera todas las versiones de XMLSerializer para usted en una biblioteca llamada "{original-library-name} .XmlSerializers.dll."

Tendrá que ejecutarlo como herramienta de línea de comandos (¿tal vez como post-buildstep?) Ya que la opción que está disponible en las 'opciones de proyecto' no es 'lo que espera que haga' según la documentación. Si activa esto o no, no siempre generará los ensambles que necesita.

Después de ejecutar esta herramienta, ahora tiene una biblioteca que contiene todos los serializadores para su proyecto. Ahora puede usar esta biblioteca para verificar si los serializadores esperados están disponibles.

Espero que esto ayude,

3

La forma más sencilla de probar este tipo de problemas (donde la serialización es incompleta o incorrecta) es a prueba de unidad - nada complicado.

  • Crear un objeto de su serializable tipo
  • Establecer todas las propiedades
  • serializarlo
  • Tome la salida en serie y deserializar en un nuevo objeto
  • Comprobar todas las propiedades de la Objeto para asegurarse de que aún están ocupados.
  • Error al probar la unidad si alguna de las propiedades no está configurada en el valor esperado

Recuerda que generalmente es el comportamiento que intentas probar, no la implementación. Las herramientas que buscan atributos específicos son solo de valor para probar una única implementación de su código: una prueba unitaria como la anterior podría funcionar para cualquier forma de serialización o almacenamiento sin reescribir la prueba.

5

Para aquellos que ven esta pregunta, he encontrado que la adición de controladores de eventos para los eventos UnknownNode y UnknownAttribute de XmlSerializer es muy útil. Incluso si lo deja arrojando una nueva NotImplementedException, puede establecer un punto de interrupción y ver cuándo se encuentran los nodos y atributos desconocidos.

Por ejemplo:

 public void Open(string filename) 
     { 

      // Create serializer 
      XmlSerializer serializer = new XmlSerializer(typeof(ObjectType)); 

      // Set event handlers for unknown nodes/attributes 
      serializer.UnknownNode += new XmlNodeEventHandler(serializer_UnknownNode); 
      serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute); 

... 

     } 

     private static void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e) 
     { 
      throw new System.NotImplementedException(); 
     } 

     private static void serializer_UnknownNode(object sender, XmlNodeEventArgs e) 
     { 
      throw new System.NotImplementedException(); 
     } 
Cuestiones relacionadas