Cualquier buena muestra sobre cómo serializar la lista de objetos genéricos con clase base abstracta. Las muestras con clase base no abstracta se enumeran en XML Serialize generic list of serializable objects. Mi clase base es similar a Microsoft.Build.Utilities.TaskXML Serializar lista genérica de objetos serializables con clase base abstracta
Respuesta
A menudo es útil tener clases abstractas con varios tipos derivados para permitir el uso de listas fuertemente tipadas y similares.
Por ejemplo, puede tener una clase DocumentFragment que es abstracta y dos clases concretas llamadas TextDocumentFragment y CommentDocumentFragment (este ejemplo de Willis).
Esto permite la creación de una propiedad de Lista que puede contener solo objetos de esos dos tipos.
Si se intenta crear un servicio web que devuelve esta lista se produce un error, pero esto es fácil de recorrer con el código de abajo ....
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
Los atributos XmlInclude decir a la clase que podría ser serializado a esas dos clases derivadas.
Esto genera un atributo en el elemento DocumentFragment que especifica el tipo real, como se muestra a continuación.
<DocumentFragment xsi:type="TextDocumentFragment">
Cualquier propiedad adicional específica para la clase derivada también se incluirá con este método.
Otra alternativa es utilizar el XmlElementAttribute
para mover la lista de tipos conocidos en la lista genérica en sí ...
using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
public abstract class Animal
{
public int Weight { get; set; }
}
public class Cat : Animal
{
public int FurLength { get; set; }
}
public class Fish : Animal
{
public int ScalesCount { get; set; }
}
public class AnimalFarm
{
[XmlElement(typeof(Cat))]
[XmlElement(typeof(Fish))]
public List<Animal> Animals { get; set; }
public AnimalFarm()
{
Animals = new List<Animal>();
}
}
public class Program
{
public static void Main()
{
AnimalFarm animalFarm = new AnimalFarm();
animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 });
animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 });
XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm));
serializer.Serialize(Console.Out, animalFarm);
}
}
... que también dará lugar a una salida XML mejor aspecto (sin la fea xsi:type
atributo) ...
<?xml version="1.0" encoding="ibm850"?>
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cat>
<Weight>4000</Weight>
<FurLength>3</FurLength>
</Cat>
<Fish>
<Weight>200</Weight>
<ScalesCount>99</ScalesCount>
</Fish>
</AnimalFarm>
si desea mantener el elemento Animals, puede usar XmlArrayItemAttribute en su lugar. – Console
- 1. Cómo XML serializar clase infantil con su clase base
- 2. serializar clase a XML?
- 3. Error al serializar una clase abstracta con refuerzo
- 4. XML serializando una lista de una clase base
- 5. Base abstracta o clase auxiliar
- 6. Diccionario que contiene solo objetos serializables
- 7. implementando un operador de conversión en una clase abstracta genérica
- 8. Registro página genérica clase base
- 9. Django: consultar una clase base abstracta
- 10. ¿Cómo serializar objetos anónimos a XML?
- 11. Python - Prueba de una clase base abstracta
- 12. serialización de Java con partes no serializables
- 13. devolver una lista de clase abstracta
- 14. Cómo serializar una clase derivada como su clase base
- 15. ASP.NET MVC base genérica vista de clase
- 16. serialización de una clase abstracta
- 17. Singleton y clase base abstracta en C++
- 18. XML Serializar objeto dinámico
- 19. Monitor.TryEnter con clase genérica
- 20. Python 2.6, 3 malentendido de clase base abstracta
- 21. Genéricos con parámetros genéricos y clase abstracta
- 22. php clase abstracta extendiendo otra clase abstracta
- 23. Derivar clase abstracta de la clase no abstracta
- 24. Clase base abstracta vs. Clase concreta como SuperTipo
- 25. Campo de modelo de Django para la clase base abstracta
- 26. Tipos genéricos vs Clase abstracta/Interfaces
- 27. detección de constructores protegidos de la clase base (posiblemente abstracta)
- 28. C# Xml-Serializar una clase derivada utilizando IXmlSerializable
- 29. ¿Están todas las excepciones de .NET serializables?
- 30. Cómo completar una lista genérica de objetos en C# desde la base de datos SQL
De acuerdo con @Dmitry. Se puede encontrar una respuesta alternativa en Serializar sin XmlInclude http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter