一个 缺失的 元素和一个 null 元素是有区别的。
对于缺失的元素,例如 <a><b>2</b></a>
,在这里 C 会采用你指定的默认值(使用 DefaultValue 属性),如果没有明确的默认值,则为 null。
对于 null 元素,例如 <a><b>2</b><c xs:Nil='true'/></a>
,你将会得到 null。
当你做 <a><b>2</b><c></c><a/>
时,xml 序列化程序将尝试将 string.Empty 解析为整数并正确地失败。
由于你的提供程序生成了无效的 xml,如果使用 XmlSerializer,则需要这样做:
[XmlRoot(ElementName = "a")]
public class A
{
[XmlElement(ElementName = "b")]
public int? B { get; set; }
[XmlElement(ElementName = "c")]
public string _c { get; set; }
public int? C
{
get
{
int retval;
return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c, out retval) ? (int?) retval : null;
}
}
}
或者稍微好一点使用DataContractSerializer
[DataContract(Name="a")]
public class A1
{
[DataMember(Name = "b")]
public int? B { get; set; }
[DataMember(Name = "c")]
private string _c { get; set; }
public int? C
{
get
{
int retval;
return !string.IsNullOrWhiteSpace(_c) && int.TryParse(_c, out retval) ? (int?)retval : null;
}
}
}
虽然DataContractSerializer不支持属性,但如果这是一个问题,可以考虑其他方案。