16

我在反序列化某些 XML 时遇到问题;第三方提供的 XML 非常冗长,因此如果没有为特定元素设置值,它将提供和空元素(例如<element1 />)。

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

但是,将来可能会出现我们没有太多控制权的情况——在这种情况下,有没有办法指定一个默认值,也许是通过装饰?

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

2 回答 2

42

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

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

然而XmlSerializer对此的解释不是“提供一个空元素”——而是“省略元素(/属性)”。甚至int?不映射到“空”。要处理元素,您必须将其作为字符串处理。这是丑陋的。

于 2010-08-16T10:54:44.823 回答
0

使用 [DefaultValue] 进行装饰似乎不是完整的解决方案,因为它并不总是有效。另一个简单的解决方案(可能不干净)

public string _sourceSubFolderName;
    [DefaultValueAttribute("")]
    [XmlElement("SourceSubFolderName")]
    public string SourceSubFolderName
    {
        get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
               string.Empty : _sourceSubFolderName; }
        set { _sourceSubFolderName = value; }
    }
于 2012-10-31T10:15:57.437 回答