Cuando una clase se hereda de List , XmlSerializer no serializa otros atributos

Estoy teniendo una situación aquí, necesito que mi clase sea heredada de List , pero cuando hago esto, XmlSerializer no serializa ninguna propiedad o campo declarado en mi clase, el siguiente ejemplo demuestra:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); DoSerialize(); } private void DoSerialize() { MyClass obj = new MyClass(); obj.Add(1); obj.Add(2); obj.Add(3); XmlSerializer s = new XmlSerializer(typeof(MyClass)); StringWriter sw = new StringWriter(); s.Serialize(sw, obj); } } [Serializable] [XmlRoot] public class MyClass : List { public MyClass() { } int myAttribute = 2011; [XmlAttribute] public int MyAttribute { get { return myAttribute; } set { myAttribute = value; } } } 

el XML resultante:

   1 2 3  

Esto es por diseño. No sé por qué se tomó esta decisión, pero se afirma en la documentación :

  • Clases que implementan ICollection o IEnumerable. Solo las colecciones son serializadas, no son propiedades públicas.

(Consulte la sección “Elementos que se pueden serializar”). Alguien ha archivado un error en contra de esto, pero no se cambiará . Aquí, Microsoft también confirma que no incluir las propiedades para las clases que implementan ICollection es, de hecho, el comportamiento de XmlSerializer.

Una solución alternativa sería:

  • Implemente la serialización de control y IXmlSerializable usted mismo.

o

  • Cambia MyClass para que tenga una propiedad pública de tipo List (y no la subclases).

o

  • Use DataContractSerializer, que maneja este escenario.

Aquí hay un pensamiento para que consideres.

Puedes tener una clase que sea una clase contenedora como esta:

 class ContainerObject { public int MyNewProperty { get; set; } [XmlElement("")] public List MyList { get; set; } } 

El truco es tener XmlElement name = “” sobre el elemento List.

Cuando esto se serialice en xml, tendrá:

  ... ... ...  

Si lo desea, también puede crear otra clase para elementos en una lista

  class MyItem { public int MyProperty {get;set;} } 

y luego, en lugar de tener la Lista de ints, tener una Lista de MyItems.

Este era el control del nombre XmlElement de cada elemento en una lista.

Espero que esto haya sido útil.