Working on a project today, i needed to serialize one of my classes that included at System.Net.IPAddress property.
Problem problem is that IPAddress does not support XML Serialization since it does not implement a parameterless constructor!
I tried to search the net, but couldnt find a complete guide, therefore i am posting this, hoping to help others in the same situation!
My solution is to serialize the IPAddresses as a string, and later parse them top ip adresses again.
public class IPRange : IComparable, IXmlSerializable { public IPAddress StartIP { get; set; } public IPAddress EndIP { get; set; } public IPRange() { } public IPRange(IPAddress start, IPAddress end) { this.StartIP = start; this.EndIP = end; } public double StartDec { get { return Dot2Dec(this.StartIP); } } public double EndDec { get { return Dot2Dec(this.EndIP); } } #region Private Helpers private double Dot2Dec(IPAddress ip) { string ipstring = ip.ToString(); var arrIP = ipstring.Split('.'); return (Convert.ToInt64(arrIP[0]) * (Math.Pow(2, 24))) + (Convert.ToInt64(arrIP[1]) * (Math.Pow(2, 16))) + (Convert.ToInt64(arrIP[2]) * (Math.Pow(2, 8))) + Convert.ToInt64(arrIP[3]); } #endregion #region IComparable<Boundary> Members public int CompareTo(Boundary other) { return this.StartDec.CompareTo(other.IPRange.StartDec); } #endregion #region IComparable Members public int CompareTo(object obj) { double thisValue = this.StartDec; double otherValue = (obj as IPRange).StartDec; return thisValue.CompareTo(otherValue); } #endregion #region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() { throw new NotImplementedException(); } public void ReadXml(System.Xml.XmlReader reader) { this.StartIP = IPAddress.Parse(reader.GetAttribute("StartIP")); this.EndIP = IPAddress.Parse(reader.GetAttribute("EndIP")); } public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteAttributeString("StartIP", StartIP.ToString()); writer.WriteAttributeString("EndIP", EndIP.ToString()); } #endregion }
As you can see above i have used the IXmlSerialization interface, to define my custom serialization and deserialization of the IPAddress objects.
I have included my whole class where i have included 2 properties “StartDec” and “EndDec”
These are a double, containing the converter ip adresses. I use them for checking if an ip is inside the defined range. and to make them sortable in list etc.
Thats all for today. Have fun!