2010-07-14 7 views
21

Ho una classe con numerose proprietà Nullable <T> che desidero essere serializzabili in XML come attributi. Questo è apparentemente un no-no in quanto sono considerati "tipi complessi". Così, invece a implementare il modello * specificato, dove creo un'aggiunta * Valore e * proprietà specificato come segue:XmlSerializer e attributi nullable

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

che funziona bene - se la proprietà della 'Age' ha un valore, esso viene serializzato come attributo. Se non ha un valore, non è serializzato.

Il problema è che, come ho già detto, ho un sacco di Nullable nella mia classe e questo schema sta solo rendendo le cose disordinate e ingestibili.

Spero ci sia un modo per rendere Nullable più compatibile con XmlSerializer. Oppure, in mancanza, un modo per creare un sostituto Nullable che è.

Qualcuno ha qualche idea su come potrei farlo?

Grazie.

risposta

8

Implementare l'interfaccia IXmlSerializable sulla classe. È quindi possibile gestire casi speciali come nullable nei metodi ReadXML e 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

Immagino che questo dovrà fare - sarebbe bello poter dire a un tipo 'complesso' di serializzare come attributo. – Barg

9

Ho avuto un problema simile con un codice su cui stavo lavorando, e ho deciso semplicemente di utilizzare una stringa per la proprietà che stavo serializzazione e la deserializzazione. Ho finito con qualcosa di simile:

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