Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
Mit XmlSerializer Objekte als XML speichern und laden
spacer
Autor Nachricht
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Co-Administrator

Beiträge: 5175
Erhaltene Danke: 2
Dabei seit: 23.07.2002
Wohnort: Pliezhausen

Windows 7 , Server 2008 R2
D7 Pro, VS.NET 2010 (C#)
BeitragVerfasst: Mi 27.09.06 22:51  Antworten mit Zitat Beitrag melden
Der XmlSerializer
Der XmlSerializer setzt Objekteigenschaften, die die als public deklariert sind, in XML um und umgekehrt.
Beispielsweise haben wir folgende Klassendeklaration:
ausblenden C#-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public class MyClass
{
    private string test1;
    public string Test1
    {
        get { return test1; }
        set { test1 = value; }
    }
    private string privateString;
    public string publicString;

    public MyClass()
    {
        test1 = "Teststring mit get/set-Methoden";
        privateString = "Private String";
        publicString = "Public String";
    }
}

Serialisieren des Objekts
Wir erzeugen im folgenden Code nun eine Instanz des Objekts und serialisieren diese mittels des XmlWriters in eine XML-Datei, die anschließen in einer TextBox angezeigt wird:
ausblenden C#-Quelltext markieren
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
//Serialize
MyClass test = new MyClass();
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.IndentChars = "  ";
XmlWriter xw = XmlWriter.Create("test.xml",xws);
XmlSerializer xs = new XmlSerializer(typeof(MyClass));
xs.Serialize(xw, test);
xw.Close();

//Show XML-File
StreamReader sr = File.OpenText("test.xml");
textBox1.Text = sr.ReadToEnd();

Die Instanz von XmlWriterSettings sorgt dabei für eine lesbarere Darstellung, mit Zeilenumbrüchen und Einrückungen (Indent), der XmlWriter übernimmt das Schreiben in die Datei test.xml.

Danach wird eine XmlSerializer-Instanz erzeugt, der die eigentliche Klassendeklaration übergeben wird, damit diese das Objekt kennt.

Dem anschließenden Aufruf von Serialize wird der XmlWriter (oder eine andere ausgebende Instanz eines unterstützen Objekts) und die zu serialisierende Objektinstanz übergeben.

Die Datei test.xml enthält daraufhin folgende Zeilen:
ausblenden XML-Daten markieren
1:
2:
3:
4:
5:
<?xml version="1.0" encoding="utf-8"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <publicString>Public String</publicString>
  <Test1>Teststring mit get/set-Methoden</Test1>
</MyClass>

Hier sehen wir, dass wie oben beschrieben das öffentliche property Test1 und der öffentliche String publicString serialisiert wurden.

Deserialisieren
Natürlich können wir diesen Weg auch umgekehrt gehen und das Objekt wieder aus der XML-Datei mit Daten befüllen. Dazu benötigen wir lediglich eine Objektvariable des Zieltyps, einen StreamReader (oder auch XmlReader) und den XmlSerializer:
ausblenden C#-Quelltext markieren
1:
2:
3:
MyClass test;
XmlSerializer xs = new XmlSerializer(typeof(MyClass));
test = (MyClass) xs.Deserialize(new StreamReader("test.xml"));

Und schon hat man wieder ein befülltes Objekt.

Anmerkungen
Diese Vorgehensweise kann auch mit Klassen verwendet werden, die Unterklassen enthalten und diese veröffentlichen.

Wenn wir beispielweise eine public-Variable vom Typ MyClass2 in MyClass hätten, würde diese auch serialisiert werden, mit den Daten in einem Unterknoten von MyClass:
ausblenden XML-Daten markieren
1:
2:
3:
4:
5:
6:
7:
8:
<?xml version="1.0" encoding="utf-8"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <publicString>Public String</publicString>
  <Test1>Teststring mit get/set-Methoden</Test1>
  <myClass2>
    <TestString>Eine public-Variable in Klasse MyClass2</TestString>
  </myClass2>
</MyClass>

Diese Serialisierung kann z.B. zur Speicherung von Daten oder zur Datenübertragung verwendet werden. Auch Konfigurationsdaten können leicht gespeichert, geladen und sogar ähnlich einer INI-Datei von Anwendern geändert werden. Nur sollte man dabei die Form der Datei möglichst nicht verändern.

Ich habe auch noch das Beispielprojekt angehängt (allerdings für Visual Studio 2005).
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von UGrohne am Do 19.10.06 13:46, insgesamt 1-mal bearbeitet
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Gast
Gast





BeitragVerfasst: Mi 18.10.06 21:58  Antworten mit Zitat Beitrag melden
Sehr gut

Aber wie mache ich das wenn ich eine Verschachtelung in den Klassen habe (Composite)?

lg
E
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Co-Administrator

(Threadstarter)

Beiträge: 5175
Erhaltene Danke: 2
Dabei seit: 23.07.2002
Wohnort: Pliezhausen

Windows 7 , Server 2008 R2
D7 Pro, VS.NET 2010 (C#)
BeitragVerfasst: Do 19.10.06 13:47  Antworten mit Zitat Beitrag melden
Anonymous hat folgendes geschrieben:
Aber wie mache ich das wenn ich eine Verschachtelung in den Klassen habe (Composite)?

Steht doch in den Anmerkungen, auch diese werden mit serialisiert? Oder meinst Du etwas anderes?
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home