serialize serializar net into example deserializar c# .net xml-serialization

c# - serializar - system xml serialization xmlserializer vb net



¿Por qué mis propiedades públicas no están serializadas por XmlSerializer? (7)

¡Además las propiedades que devuelven null no se serializan!

Este es uno con el que luché durante años, así que pensé en documentar en alguna parte. (Disculpas por hacer y responder una pregunta).

(C # .net 2.0) Tuve una clase que estaba siendo serializada por XmlSerializer, agregué una nueva propiedad pública, sin embargo, no se incluyó en el XML de salida.

No se menciona en los documentos en ningún lugar que pueda encontrar, ¡pero las propiedades públicas deben tener un conjunto así como un ser serializado! Supongo que esto se debe a que supone que si vas a serializar, querrás deserializar desde el mismo archivo, por lo que solo serializará las propiedades que tengan un conjunto y un get.


Como se mencionó, la mayoría de las propiedades deben tener tanto un getter como un setter; la principal excepción a esto son las listas, por ejemplo:

private readonly List<Foo> bar = new List<Foo>(); public List<Foo> Bar {get { return bar; } } // works fine

que funcionará bien; sin embargo, si XmlSerializer encuentra un setter, exige que sea público; lo siguiente no funcionará:

public List<Foo> Bar {get; private set;} // FAIL

Otros motivos por los que podría no serializarse:

  • no es público con get y set (o es readonly para un campo)
  • tiene un atributo [DefaultValue] , y tiene ese valor
  • tiene un método bool ShouldSerializeFoo() público bool ShouldSerializeFoo() que devolvió false
  • tiene un bool FooSpecified {get;set;} público bool FooSpecified {get;set;} propiedad o campo que devolvió false
  • está marcado [XmlIgnore]
  • está marcado [Obsolete]

Cualquiera de estos hará que no se serialice



Puede implementar el IXmlSerializer y realizar la serialización de forma manual, y beneficiarse de las propiedades de serialización, y viceversa, deserializarlas mediante constructores / asignación de campo privada.


Una cosa más para agregar sobre la serialización de colecciones:

¡XmlSerializer ignora colecciones de interfaces!

Y con eso quiero decir ignorar . Mientras obtendrá una excepción para una línea como:

public IFoo Foo { get; set; }

no recibirá una excepción para:

public ICollection<IFoo> LotsOfFoos { get { return this.fooBackingField; } }


Y si su clase hereda una lista y también tiene sus propios miembros, solo los elementos de la lista se serializan. Los datos presentes en los miembros de su clase no se capturan. Tomó algo de tiempo descifrar esto!


si no desea implementar los Setters adecuados (porque tal vez no desee deserializar o cambiar el valor de un objeto), puede usar setters ficticios como este set { } , para que XMLSerializer funcione, pero no pasa nada si usa el Setter...

es decir

public string ID { get { return _item.ID.ToString(); } set { } }