serializar - xml from object c#
XmlSerializer y atributos anulables (2)
Tuve un problema similar con un código en el que estaba trabajando, y decidí usar una cadena para la propiedad que estaba serializando y deserializando. Terminé con algo como esto:
[XmlAttribute("Age")]
public string Age
{
get
{
if (this.age.HasValue)
return this.age.Value.ToString();
else
return null;
}
set
{
if (value != null)
this.age = int.Parse(value);
else
this.age = null;
}
}
Tengo una clase con numerosas propiedades Nullable <T> que deseo ser serializable a XML como atributos. Esto es aparentemente un no-no, ya que se consideran ''tipos complejos''. Por lo tanto, en su lugar, implemento el * patrón especificado, donde creo un valor adicional * y * propiedad especificada de la siguiente manera:
[XmlIgnore] public int? Age { get { return this.age; } set { this.age = value; } } [XmlAttribute("Age")] public int AgeValue { get { return this.age.Value; } set { this.age = value; } } [XmlIgnore] public bool AgeValueSpecified { get { return this.age.HasValue; } }
Lo cual funciona bien: si la propiedad ''Edad'' tiene un valor, se serializa como un atributo. Si no tiene un valor, no está serializado.
El problema es que, como mencioné, tengo muchos Nullable-s en mi clase y este patrón solo hace las cosas desordenadas e inmanejables.
Espero que haya una manera de hacer que Nullable sea más amigable con XmlSerializer. O, en su defecto, una forma de crear un reemplazo Nullable que es.
¿Alguien tiene alguna idea de cómo podría hacer esto?
Gracias.
Implementa la interfaz IXmlSerializable
en tu clase. A continuación, puede manejar casos especiales tales como WriteXML
métodos ReadXML
y WriteXML
. Hay un buen ejemplo en la página de documentación de MSDN. .
class YourClass : IXmlSerializable
{
public int? Age
{
get { return this.age; }
set { this.age = value; }
}
//OTHER CLASS STUFF//
#region IXmlSerializable members
public void WriteXml (XmlWriter writer)
{
if( Age != null )
{
writer.WriteValue( Age )
}
}
public void ReadXml (XmlReader reader)
{
Age = reader.ReadValue();
}
public XmlSchema GetSchema()
{
return(null);
}
#endregion
}