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

CJM*_*CJM 15 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 38

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

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

然而 ; XmlSerializer对此的解释不是"提供空元素" - 而是"省略元素(/ attribute)".甚至int?不映射到"空".要处理元素,您必须将其作为字符串处理.这很难看.