我有一个问题反序列化一些XML;第三方提供的XML非常详细,因此如果没有为特定元素设置值,它将提供并清空元素(例如<element1 />
)。
这是某些元素的问题,例如,那些用于存储整数的元素。我可以控制第三方,所以我可以让他们指定一个默认值(<myinteger>0</myinteger>
),或者我可以让他们完全省略这些元素。这两个都应该避免这个问题。
但是,将来可能会出现这样的情况,即我们没有那么多控制权 - 在这种情况下,有没有办法通过装饰指定默认值?
[XmlElement("myinteger")=0???]
public int MyInteger
{
get
{
return myInteger;
}
set
{
myInteger= value;
}
}
答案 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; }
}