Entwickler-Ecke
IO, XML und Registry - Serialisierung IP Adresse
Gabe - Do 17.12.09 00:24
Titel: Serialisierung IP Adresse
Hi zusammen,
ich nutze hier System.Net.IPAddress und würde sie gerne mit XmlSerializer serialisieren.
Bekomme die Exception
Zitat: |
System.Net.IPAddress kann nicht serialisiert werden, weil dafür kein parameterloser Konstruktor verfügbar ist. |
Habe jetzt im Netz ein wenig gesucht, aber keine direkte Lösung gefunden. Nur den Vorschlag die IP-Adresse in String zu wandeln und dann zu serialisieren.
Gibt's da noch etwas Besseres?
Gruß Gabe
Christian S. - Do 17.12.09 00:29
Gabe hat folgendes geschrieben : |
Gibt's da noch etwas Besseres? |
Inwiefern besser?
danielf - Do 17.12.09 09:25
Das Objekt ist nicht so kompliziert, so dass ein String wahrscheinlich kaum ein Aufwand ist.
Ich hab gerade getestet eine abgeleitete Klases mit einem parameterlosen Konstruktor zu machen.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public class SerializableIPAddress : System.Net.IPAddress { public SerializableIPAddress() : base(System.Net.IPAddress.IPv6Loopback.GetAddressBytes()) { } } |
Das Serialisieren ging ...
C#-Quelltext
1: 2: 3: 4: 5: 6:
| SerializableIPAddress ip = new SerializableIPAddress();
System.Xml.Serialization.XmlSerializer s = new System.Xml.Serialization.XmlSerializer(typeof(SerializableIPAddress));
s.Serialize(System.IO.File.OpenWrite(@"C:\test.xml"), ip); |
Aber ich vermute beim Deserialisieren wird er die Werte nicht Richtig gesetzen - keine Ahnung, kannst es ja testen und es uns dann wissen lassen.
Gruß Daniel
Gabe - Do 17.12.09 19:48
Ich dachte, dass ich die IP-Adresse in einen String wandle, den String serialisiere und beim Deserialisieren den String wieder in die IP-Adresse schreibe. Habe hierfür ein kleines ablauffähiges Konsolenprogramm, dann seht ihr was ich meine:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72:
| using System; using System.Net; using System.Xml.Serialization; using System.IO;
namespace IpAdressSerialisierung { class Program { static void Main(string[] args) { try { byte[] testByte = new byte[] { 192, 168, 2, 1 }; Object2Serialize SerObject = new Object2Serialize(); SerObject.RealIpAddress = new IPAddress(testByte);
XmlSerializer xmlser = new XmlSerializer(typeof(Object2Serialize)); StreamWriter strWr = new StreamWriter("D:\\test.xml"); xmlser.Serialize(strWr, SerObject); strWr.Close();
XmlSerializer xmldeser = new XmlSerializer(typeof(Object2Serialize)); Object2Serialize deserObject = new Object2Serialize(); StreamReader strRea = new StreamReader("D:\\test.xml"); deserObject = xmldeser.Deserialize(strRea) as Object2Serialize; } catch (Exception e) { Console.WriteLine(e.Message); } } }
[Serializable()] public class Object2Serialize { private IPAddress realIpAddress;
[XmlIgnore()] public IPAddress RealIpAddress { get { return realIpAddress; } set { realIpAddress = value; sIpAddress = value.ToString(); } }
private string sIpAddress;
[XmlElement(ElementName = "IP-Adresse")] public string SIpAdress { get { return sIpAddress; } set { sIpAddress = value;
if (realIpAddress == null) { realIpAddress = IPAddress.Parse(value); } } } } } |
Das funktioniert eigentlich genauso, wie ich es schlussendlich auch haben möchte. Ich habe in meiner Klasse aber mehrere IP-Adress-Objekte, von dem her müsste ich für jede wieder einen String hinzufügen, den ich wieder zum Serialisieren benötige. Das ist ja umständlich, und da wollte ich nach einer kürzeren, besseren Lösung fragen... :-)
danielf hat folgendes geschrieben: |
keine Ahnung, kannst es ja testen und es uns dann wissen lassen. |
Das mit dem Ableiten habe ich auch versucht, ich weiß aber nicht, was ich da mit der Loopback-Adresse soll. Ich möchte eine eigene Adresse übergeben, so wie ich das oben in meinem Beispiel mache.
Hoffe das Ganze ist jetzt etwas klarer.
Gruß Gabe
danielf - Do 17.12.09 20:42
Das loopback ist doch nur der Initialwert ...
Gabe - Do 17.12.09 21:09
danielf hat folgendes geschrieben : |
Das loopback ist doch nur der Initialwert ... |
Versteh das gerade nicht:
C#-Quelltext
1: 2: 3: 4:
| public class testClass { public SerializableIPAddress testIp {get; set;} } |
In Main:
C#-Quelltext
1: 2:
| testClass neueInstanz = new testClass(); neueInstanz.SerializableIPAddress = .... |
Wie kann ich hier jetzt eine andere IP-Adresse übergeben? Das kann ich doch nur in der Basis-Klasse mit den Konstruktoren. Aber wie kann ich darauf zugreifen?
danielf - Do 17.12.09 22:34
Hast Recht geht nicht wie ich dachte :)
Nimm einfach einen String...
Gabe - Do 17.12.09 22:37
Ok, alles klar. Schade...
Dann lass ich es so wie oben. Trotzdem danke für deine Bemühungen.
Falls jemand noch ne schönere Lösung hat, bitte melden :-)
Ralf Jansen - Do 17.12.09 23:36
Falls du neben den IP Adressen nicht noch anderes (komplexes) zum serialisieren in der Klasse hast wäre ein Implementierung von IXmlSerializable mit ~eigener~ Serialisierung noch eine Möglichkeit.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public class Object2Serialize : IXmlSerializable { public IPAddress RealIpAddress { get; set; } public IPAddress UnrealIpAddress { get; set; }
#region IXmlSerializable Members
public void WriteXml(XmlWriter writer) { writer.WriteElementString("RealIpAddress", RealIpAddress.ToString()); writer.WriteElementString("UnrealIpAddress", UnrealIpAddress.ToString()); }
public void ReadXml(XmlReader reader) { reader.Read(); RealIpAddress = IPAddress.Parse(reader.ReadElementString("RealIpAddress")); UnrealIpAddress = IPAddress.Parse(reader.ReadElementString("UnrealIpAddress")); }
public XmlSchema GetSchema() { return (null); }
#endregion } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!