There's a difference between a missing element and a null element.
A missing element, <a><b>2</b></a>
. Here C would take whatever default value you specify, using the DefaultValue attribute, or null if there's no explicit default.
A null element <a><b>2</b><c xs:Nil='true'/></a>
. Here you will get null.
When you do <a><b>2</b><c></c><a/>
the xml serializer will try to parse string.Empty as an integer an will correctly fail.
Since your provider is generating invalid xml you will need to do this, if using the 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;
}
}
}
or slightly better using the 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;
}
}
}
although the DataContractSerializer doesn't support attributes if that's a problem.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…