2009-06-19 15 views
5

Tengo crear aplicaciones de pruebas que tiene 3 clasesXmlSerializer.Serialize ambigua

  • coche
  • Radio
  • SPORTCAR: Coche (tiene un radio)

A medida que el proceso de serialización cuando crear instancia del objeto XmlSerializer utilizo 2 objetos para probar

XmlSerializer xmlSerializer = new XmlSerializer(typeof(SportCar)); 

y

XmlSerializer xmlSerializer = new XmlSerializer(
    typeof(SportCar), 
    new Type[] { typeof(Car), typeof(Radio) }); 

El resultado de este enfoque 2 es idéntico, por lo que me gustaría saber cuál es la diferencia entre estos 2 constructor o punto crítico que necesitan utilizar # 2 constructor?

Respuesta

8

La gran diferencia es cuando se necesita decir XmlSerializer sobre sub clases - por ejemplo:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Car), 
    new Type[] { typeof(SportCar), typeof(Radio) }); 

Aquí, sin la información adicional si no hubiera conocido (sólo de Car) sobre cualquiera SportCar o Radio - por lo que si se le da un objeto que es en realidad un SportCar, que fracasaría:

Car car = new SportCar {...}; 
xmlSerializer.Serialize(destination, car); 

también puede hacer esto establecer [XmlInclude(typeof(SportCar))] contra la definición Car Tipo:

[XmlInclude(typeof(SportCar))] 
public class Car {...} 

Esto es más fácil, pero sólo es posible si el tipo Car se encuentra en un conjunto que sabe de SportCar. Pero a menudo do saber esto, por lo que XmlInclude es la opción preferida.

Además: hay algunos beneficios de eficiencia de XmlInclude; detrás de escena, el sistema usa generación de tipo dinámica para hacer que XmlSerializer sea eficiente. Por esta razón, generalmente debe mantener (y reutilizar) la instancia XmlSerializer que cree; por ejemplo, al almacenarlo en un campo estático. Sin embargo, el sistema lo hace automáticamente para el uso predeterminado (new XmlSerializer(typeof(Car))), es decir, no importa cuántas veces use este constructor, solo genera el código dinámico una vez. Si usa el constructor más complejo (new XmlSerializer(typeof(Car),new Type[] { typeof(SportCar), typeof(Radio) })), generará el tipo cada vez.

+0

¿Cuál es la diferencia en el resultado si especifico la información de la clase secundaria? (Soy nuevo en el proceso de serialización) – Anonymous

+1

No hay diferencia en el resultado entre el uso del enfoque XmlInclude y el constructor (nuevo enfoque Type []); ellos son equivalentes Si no hace ninguna de las dos cosas, solicite un XmlSerializer (typeof (Car)), pero dele un SportCar, arrojará una excepción. –

+0

Veo, después de leer el tema sobre XmlSerializer en C# 3.0 en pocas palabras y de vuelta para leer su respuesta que menciona "sobre las subclases" me hace entender cómo funciona XmlSerializer. (Compré otro libro para estudiar C#, qué lástima). – Anonymous

Cuestiones relacionadas