Announcement

Collapse
No announcement yet.

XmlSerializer mit eigenen Klassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XmlSerializer mit eigenen Klassen

    Ich habe eine eigene Klasse für die Properties erstellt. Hierin sollen die Typen Font, Color und FlatStyle gekapselt werden. Soweit, sogut. Aber wenn ich die Klasse mittels XmlSerializer serialisieren möchte, kommt die Fehlermeldung:<br>
    <b><i>Fehler beim Reflektieren von 'Klassenname'.</i></b>

    Kann es sein, dass diese Typen nicht serialisierabr sind? Wen doch, warum geht es dan nicht?

    Andreas Gräfe

  • #2
    Hallo Andreas,

    Der XmlSerializer kann nur Klassen ist hauptsaechlich dafuer gedacht XML Dokumente die einem festen schema entsprechen an Objekte zu binden. Er ist weniger geeignet um x-beliebige Klassen zu serialisieren. Das koennen der BinaryFormatter und der SoapFormatter wesentlich besser.

    Unter [0] findest Du einen Thread mit einem Beispiel wie Du Color Objekt mittels einer Wrapperklasse serialisieren kannst.

    HTH,
    Christoph Schittko
    Software Architect, .NET Mentor
    [0] http://groups.google.com/groups?threadm=%2319ODSQhCHA.3708%40tkmsftngp0

    Comment


    • #3
      Ich habe die Ideen mal versucht umzusetzen. Da gibt es aber ein paar Probleme. Die Fehlermeldung bei serialisieren lautet:
      <pre>
      Eine nicht behandelte Ausnahme des Typs 'System.Runtime.Serialization.SerializationExcepti on' ist in mscorlib.dll aufgetreten.

      Zusätzliche Informationen: Der Typ winserial.Option in Assembly winserial, Version=1.0.1125.33000, Culture=neutral, PublicKeyToken=null ist als serialisierbar markiert.
      </pre>

      Bei deserialisieren kommt folgenden Meldung:
      <pre>
      Eine nicht behandelte Ausnahme des Typs 'System.Runtime.Serialization.SerializationExcepti on' ist in mscorlib.dll aufgetreten.

      Zusätzliche Informationen: Das Streamende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde.
      </pre>

      Der Code ist folgendermaßen aufgebaut:
      <pre>
      private void button1_Click(object sender, System.EventArgs e)
      {
      //Serialize
      Option o = new Option();
      o.BGColor = Color.White;
      o.ButtonFlatStyle = FlatStyle.Popup;
      o.HistoryFont = this.Font;
      o.MessageFont = this.Font;

      label1.BackColor = o.BGColor;
      label2.FlatStyle = o.ButtonFlatStyle;
      label3.Font = o.HistoryFont;
      label4.Font = o.MessageFont;


      BinaryFormatter bf = new BinaryFormatter();
      System.IO.Stream s = System.IO.File.Open("test.bin", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);

      bf.Serialize(s,o);

      s.Close();
      MessageBox.Show("OK");


      }

      private void button2_Click(object sender, System.EventArgs e)
      {
      //De-Serialize
      System.IO.Stream s = System.IO.File.Open("test.bin", System.IO.FileMode.Open, System.IO.FileAccess.Read);
      BinaryFormatter bf = new BinaryFormatter();
      Option o = (Option)bf.Deserialize(s);
      s.Close();

      label1.BackColor = o.BGColor;
      label2.FlatStyle = o.ButtonFlatStyle;
      label3.Font = o.HistoryFont;
      label4.Font = o.MessageFont;

      MessageBox.Show("OK");
      }
      </pre>

      <b>Kann mir da bitte jemand weiterhelfen?</b>

      Muss ich die Klasse, die ich serialisieren möchte von einem bestimmten Interface ableiten, oder was???

      Andreas Gräf

      Comment


      • #4
        Hallo,

        das folgende Beispiel demonstriert den Einsatz der Klasse XmlSerializer:

        Teil A: Klasse
        <pre>
        using System;

        namespace CSharpXMLConfig
        {
        ///
        /// Summary description for OSXMLConfigCls.
        ///
        public class OSXMLConfigData
        {
        private string FSrv;
        private string FIP;
        private DateTime FConfigDate;

        public OSXMLConfigData()
        {
        // Serialisierung -> Standard-Konstruktur muss deklariert sein
        }

        public OSXMLConfigData(string sSrv, string sIP, DateTime aDate)
        {
        FSrv = sSrv;
        FIP = sIP;
        FConfigDate = aDate;
        }

        public string Srv
        {
        get
        {
        return FSrv;
        }
        set
        {
        FSrv = value;
        }
        }

        public string IP
        {
        get
        {
        return FIP;
        }
        set
        {
        FIP = value;
        }
        }

        public DateTime ConfigDate
        {
        get
        {
        return FConfigDate;
        }
        set
        {
        FConfigDate = value;
        }
        }
        }
        }
        </pre>
        Teil B: Serialisieren
        <pre>
        using System.Xml;
        using System.Xml.Serialization;
        using System.IO;
        ...
        private string aConfigFile = "OSXMLConfigData.xlm";

        private void buttonSave_Click(object sender, System.EventArgs e)
        {
        OSXMLConfigData aCfg = new OSXMLConfigData(textBox1.Text, textBox2.Text,
        DateTime.Parse(textBox3.Text));
        XmlSerializer aXmlSer = new XmlSerializer(typeof(OSXMLConfigData));
        XmlTextWriter aXmlWrt = new XmlTextWriter(aConfigFile, new System.Text.UTF8Encoding());
        aXmlSer.Serialize(aXmlWrt, aCfg);
        aXmlWrt.Close();
        statusBar1.Text = "Daten wurden gespeichert";
        }

        private void buttonLoad_Click(object sender, System.EventArgs e)
        {
        OSXMLConfigData aCfg;
        XmlSerializer aXmlSer = new XmlSerializer(typeof(OSXMLConfigData));
        FileStream aFS = new FileStream(aConfigFile, FileMode.Open);
        XmlTextReader aXMLRdr = new XmlTextReader(aFS);
        aCfg = (OSXMLConfigData)aXmlSer.Deserialize(aXMLRdr);
        aXMLRdr.Close();
        // Werte einsetzen
        textBox1.Text = aCfg.Srv;
        textBox2.Text = aCfg.IP;
        textBox3.Text = aCfg.ConfigDate.ToString();
        statusBar1.Text = "Daten wurden eingelesen";
        }
        </pre&gt

        Comment


        • #5
          Moinsen,

          habe das so gemacht wie du es hier beschrieben hast Andreas Kosch bekomme allerdings die Fehlermeldung:

          http://www.ensode.de/error.jpg

          und bei Zeile
          XmlSerializer aXmlSer = new XmlSerializer(typeof(OSXMLConfigData));
          springt er raus...

          Benutze .NET Studio 2003...

          Ne Idee, woran es liegen könnte

          Comment

          Working...
          X