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úblicobool ShouldSerializeFoo()
que devolvió false - tiene un
bool FooSpecified {get;set;}
públicobool FooSpecified {get;set;}
propiedad o campo que devolvió false - está marcado
[XmlIgnore]
- está marcado
[Obsolete]
Cualquiera de estos hará que no se serialice
El punto acerca de getter + setter se hace en el 3er párrafo en la página " Intro to Serialization Xml ". En realidad está en una caja de llamada. No puedo perderlo!
Serialización de introducción a XML http://www.freeimagehosting.net/uploads/2f04fea2db.png
(Divertirse demasiado con Freeimagehosting.net)
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 { } }