34

我有一个具有许多 Nullable<T> 属性的类,我希望将其序列化为 XML 作为属性。这显然是一个禁忌,因为它们被认为是“复杂类型”。因此,我实现了 *Specified 模式,在其中创建了一个附加的 *Value 和 *Specified 属性,如下所示:

[Xml忽略]
公共诠释?年龄
{
    得到{返回这个年龄;}
    设置 { this.age = value; }
}

[XmlAttribute("年龄")]
公共 int AgeValue
{
    得到 { 返回 this.age.Value; }
    设置 { this.age = value; }
}

[Xml忽略]
公共布尔年龄值指定
{
    得到 { 返回 this.age.HasValue; }
}

效果很好 - 如果 'Age' 属性有一个值,它会被序列化为一个属性。如果它没有值,则不会序列化。

问题是,正如我所提到的,我的班级中有很多 Nullable-s,这种模式只会让事情变得混乱和难以管理。

我希望有一种方法可以使 Nullable 对 XmlSerializer 更加友好。或者,如果做不到这一点,一种创建 Nullable 替换的方法是。

有谁知道我该怎么做?

谢谢。

4

2 回答 2

20

我在处理一些代码时遇到了类似的问题,我决定只使用一个字符串作为我正在序列化和反序列化的属性。我最终得到了这样的结果:

[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;
于 2010-07-14T23:18:55.000 回答
12

在你的类上实现IXmlSerializable接口。ReadXML然后,您可以在andWriteXML方法中处理特殊情况,例如可为空值。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
}
于 2010-07-14T21:50:22.923 回答