2010-07-14 18 views
21

Tengo una clase con numerosas propiedades Nullable <T> que quiero ser serializable a XML como atributos. Esto es aparentemente un no-no, ya que se consideran 'tipos complejos'. Así, en lugar implemento el patrón * especificado, donde se crea una adición * Valor y * La propiedad especificada de la siguiente manera:XmlSerializer y atributos que aceptan nulos

 
[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; } 
} 

que funciona muy bien - si la propiedad de la 'edad' tiene un valor, se serializado como una 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 para 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.

Respuesta

8

Implemente la interfaz IXmlSerializable en su clase. A continuación, puede manejar casos especiales, como nulables en los métodos ReadXML y WriteXML. There's a good example in the MSDN documentation page..


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 
} 
+0

Supongo que esto tendrá que hacer, estaría bien poder decir un tipo 'complejo' para serializar como un atributo. – Barg

9

He tenido un problema similar con un cierto código que estaba trabajando, y yo simplemente decidió utilizar una cadena para la propiedad que estaba serializar y deserializar. 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; 
    } 
} 

[XmlIgnore] 
public int? age; 
Cuestiones relacionadas