XmlSerializer和可为空的属性
我有一个有很多Nullable <T>属性的类,我想将它们序列化为XML作为属性。 这显然是一个“不”,因为它们被认为是“复杂类型”。 所以,相反,我实现了* Specified模式,在这里我创建了一个* Value和* Specified属性,如下所示:
[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; } }
哪些工作正常 - 如果“Age”属性具有值,则将其序列化为属性。 如果它没有值,则不会序列化。
问题是,正如我所提到的,在我的班级中有很多Nullable-s,这种模式只是让事情变得混乱和难以管理。
我希望有一种方法可以让Nullable更友好XmlSerializer。 或者,如果失败了,则可以创建一个Nullable替代品。
有没有人有任何想法,我可以做到这一点?
谢谢。
在你的类上实现IXmlSerializable
接口。 然后,您可以处理ReadXML
和WriteXML
方法中的特殊情况,例如可空WriteXML
。 在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;
链接地址: http://www.djcxy.com/p/65137.html