使用XML装饰在反序列化期间指定默认值

时间:2010-08-16 10:19:55

标签: c# serialization xml-serialization default-value xml-deserialization

我有一个问题反序列化一些XML;第三方提供的XML非常详细,因此如果没有为特定元素设置值,它将提供并清空元素(例如<element1 />)。

这是某些元素的问题,例如,那些用于存储整数的元素。我可以控制第三方,所以我可以让他们指定一个默认值(<myinteger>0</myinteger>),或者我可以让他们完全省略这些元素。这两个都应该避免这个问题。

但是,将来可能会出现这样的情况,即我们没有那么多控制权 - 在这种情况下,有没有办法通过装饰指定默认值?

    [XmlElement("myinteger")=0???]
    public int MyInteger
    {
        get
        {
            return myInteger;
        }
        set
        {
            myInteger= value;
        }
    }

2 个答案:

答案 0 :(得分:37)

XmlSerializer 支持[DefaultValue],但在序列化期间使用它。在反序列化期间,它只运行构造函数,然后获取传入值并应用它们。因此,一种常见的方法是使用构造函数(或字段初始化程序):

public Foo() {
    Bar = 4;
}
[DefaultValue(4), XmlAttribute("bar")]
public int Bar {get;set;}

然而; XmlSerializer对此的解释不是“提供空元素” - 而是“省略元素(/ attribute)”。即使int?也不会映射为“空”。要处理元素,您必须将其作为字符串处理。这很难看。

答案 1 :(得分:0)

使用[DefaultValue]的装饰似乎不是完整的解决方案,因为它始终不起作用。另一个简单的解决方案(可能不干净)

public string _sourceSubFolderName;
    [DefaultValueAttribute("")]
    [XmlElement("SourceSubFolderName")]
    public string SourceSubFolderName
    {
        get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
               string.Empty : _sourceSubFolderName; }
        set { _sourceSubFolderName = value; }
    }