属性として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置換を作成する方法です。
誰かが私がこれを行う方法について何かアイデアがありますか?
ありがとう。
クラスに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
}
作業中のコードで同様の問題が発生したため、シリアル化および逆シリアル化するプロパティに文字列を使用することにしました。私は次のようなものになりました:
[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;