web-dev-qa-db-ja.com

XmlSerializerとnull許容属性

属性としてXMLにシリアル化できるようにしたい多数のNullable <T>プロパティを持つクラスがあります。これらは「複雑なタイプ」と見なされるため、これは明らかにノーノーです。したがって、代わりに* Specifiedパターンを実装し、次のように追加の* Valueおよび* Specifiedプロパティを作成します。

 [XmlIgnore] 
 public int? Age 
 {
 get {return this.age; } 
 set {this.age = value; } 
} 
 
 [XmlAttribute( "Age")] 
 public int AgeValue 
 {
 get {return this.age 。値; } 
 set {this.age = value; } 
} 
 
 [XmlIgnore] 
 public bool AgeValueSpecified 
 {
 get {return this.age.HasValue; } 
} 

これは正常に機能します-'Age 'プロパティに値がある場合、それは属性としてシリアル化されます。値がない場合は、シリアル化されません。

問題は、私が述べたように、クラスにNullableがたくさんあり、このパターンが物事を乱雑で管理不能にしていることです。

NullableをよりXmlSerializerに適したものにする方法があることを願っています。または、それが失敗した場合は、Nullable置換を作成する方法です。

誰かが私がこれを行う方法について何かアイデアがありますか?

ありがとう。

31
Barg

クラスにIXmlSerializableインターフェースを実装します。その後、ReadXMLメソッドとWriteXMLメソッドでnull許容型などの特殊なケースを処理できます。 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
}
10
blachniet

作業中のコードで同様の問題が発生したため、シリアル化および逆シリアル化するプロパティに文字列を使用することにしました。私は次のようなものになりました:

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