This is duplicate of Can XmlSerializer deserialize into a Nullable<int>? but I need a solution that neither change xml document nor forces me to implement IXmlSerializable interface. I dont want to implement IXmlSerializable because I have many additional elements beside <number> that get deserialized correctly.
My xml can contain either element <number>4</number> or <number/>
<root> ... either <number>4</number> or <number/> ... [other elements] </root>
Class
public class root
{
public int? number {get; set;}
...
}
does not work.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You can just use a surrogate property.
public class MyType1
{
// XmlIgnore means it is not directly serialized
[XmlIgnore]
public int? number
{
get; set;
}
// acts as a surrogate for the nullable property
[XmlElement("number")]
public string _number_Surrogate
{
get
{
return (number.HasValue) ? number.ToString() : "";
}
set
{
if (!value.Equals(""))
{
number = Int32.Parse(value);
}
}
}
public System.DateTime Time
{
get; set;
}
}
Method 2
You could always do a string replace on the final xml output.
Replace(" i:nil="true"/>","/>");
Generally, it is a bad idea to try to hack at xml with string manipulation, but the replace above is safe and will always convert <anything i:nil="true"/> to <anything/>.
It’s a hack, but an acceptable one considering the alternative.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0