2010-07-14 9 views
21

J'ai une classe avec de nombreuses propriétés < T T > que je veux sérialiser en XML comme attributs. C'est apparemment un non-non car ils sont considérés comme des «types complexes». Ainsi, au lieu que je Mettre en oeuvre le * modèle spécifié, où je crée un ajout * Valeur et * la propriété spécifiée comme suit:XmlSerializer et attributs 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; } 
} 

Ce qui fonctionne bien - si la propriété « âge » a une valeur, il est sérialisé en tant attribut. S'il n'a pas de valeur, il n'est pas sérialisé. Le problème est que, comme je l'ai mentionné, j'ai beaucoup de Nullable-s dans ma classe et ce modèle rend les choses compliquées et ingérables. Je souhaite qu'il existe un moyen de rendre Nullable plus XmlSerializer amical. Ou, à défaut, un moyen de créer un remplacement Nullable qui est.

Est-ce que quelqu'un a des idées comment je pourrais faire cela?

Merci.

Répondre

8

Implémentez l'interface IXmlSerializable sur votre classe. Vous pouvez ensuite gérer des cas spéciaux tels que les valeurs nulles dans les méthodes ReadXML et 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

Je suppose que cela devra faire - ce serait bien d'être capable de dire à un type 'complexe' de sérialiser en tant qu'attribut. – Barg

9

J'ai eu un problème similaire avec un code que je travaillais, et je décidé simplement d'utiliser une chaîne pour la propriété que je sérialisation et désérialisation. Je me suis retrouvé avec quelque chose comme ceci:

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