Другой вариант, если у вас нет контроля над входящим XML, - обойти это, заставив десериализатор сделать вид, что переменная является строкой:
[Serializable()]
public class foo
{
public foo(){}
[XmlElement("propOne")]
[EditorBrowsable(EditorBrowsableState.Never)]
public string propOneString {get;set;}
[XmlIgnore]
private int? propOneInternal = null;
[XmlIgnore]
private bool propOneSet = false;
[XmlIgnore]
public int? propOne
{
get
{
if (!propOneSet)
{
if(!string.IsNullOrEmpty(propOneString)
{
propOneInternal = int.Parse(propOneString);
}
//else leave as pre-set default: null
propOneSet = true;
}
return propOneInternal;
}
set { propOneInternal = value; }
}
}
Десериализатор рад проанализировать строковый элемент, когда он пуст, так что вы этим воспользуетесь.
Это не особенно приятно, но подойдет, если у вас есть только один или 2 тега для покрытия