Autor Beitrag
Gabe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 17.12.09 00:24 
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 17.12.09 00:29 
user profile iconGabe hat folgendes geschrieben Zum zitierten Posting springen:
Gibt's da noch etwas Besseres?
Inwiefern besser?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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.

ausblenden 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 ...

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 17.12.09 19:48 
user profile iconChristian S. hat folgendes geschrieben:
Inwiefern besser?

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:
ausblenden volle Höhe 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
            {
                // Test-Objekt anlegen
                byte[] testByte = new byte[] { 19216821 };
                Object2Serialize SerObject = new Object2Serialize();
                SerObject.RealIpAddress = new IPAddress(testByte);

                // Test-Objekt serialisieren
                XmlSerializer xmlser = new XmlSerializer(typeof(Object2Serialize));
                StreamWriter strWr = new StreamWriter("D:\\test.xml");
                xmlser.Serialize(strWr, SerObject);
                strWr.Close();

                // Test-Objekt deserialisieren
                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;

                // Beim Deserialisieren wird die String-Ip in die richtige IP gewandelt
                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... :-)

user profile icondanielf 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 17.12.09 20:42 
Das loopback ist doch nur der Initialwert ...
Gabe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: Do 17.12.09 21:09 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Das loopback ist doch nur der Initialwert ...

Versteh das gerade nicht:
ausblenden C#-Quelltext
1:
2:
3:
4:
public class testClass
{
   public SerializableIPAddress testIp {get; set;}
}

In Main:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 17.12.09 22:34 
Hast Recht geht nicht wie ich dachte :)

Nimm einfach einen String...
Gabe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 39



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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        
}