Serializing System.Net.IPAddress to XML
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!


Subscribe to Jakob's RSS Feed