Существует разница между отсутствующим элементом и нулевым элементом.
Отсутствующий элемент, <a><b>2</b></a>
. Здесь C будет принимать любое значение по умолчанию, которое вы укажете, используя атрибут DefaultValue , или NULL, если явного значения по умолчанию нет.
Нулевой элемент <a><b>2</b><c xs:Nil='true'/></a>
. Здесь вы получите ноль.
Когда вы выполните <a><b>2</b><c></c><a/>
, сериализатор xml попытается разобрать строку. Пустое число как целое число будет правильно завершено.
Поскольку ваш провайдер генерирует недействительный 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 не поддерживает атрибуты, если это проблема.