- möchte man Objekstrukturen, die Listen von abgeleiteten Objekten einer Basisklasse beinhalten, als XML serialisieren, so muss man sich des Attributs [XmlInclude(typeof(MeineAbgeleiteteKlasse))] bedienen
// Typen der abgeleiteten Klassen (auch z.B. enums!) müssen hier // bei der Basisklasse aufgeführt werden [XmlInclude(typeof(Auto))] [XmlInclude(typeof(Fahrrad))] public class Vehicel { [XmlElement("Name")] public string sName; public Vehicel() { } } public class Auto : Vehicel { [XmlElement("Räder")] public uint uiRaeder = 4; public Auto() : base() { } } public class Fahrrad : Vehicel { [XmlElement("Gepäckträger")] public bool bGepaecktraeger = true; public Fahrrad() : base() { } } [XmlRoot("Objektliste")] public class ObjektListe { // ein String [XmlElement("Name")] public string sListenName; // ein List-Array mit Objekten definieren [XmlArray("Objekte")] [XmlArrayItem("Objekt")] public List<Vehicel> Objekte = new List<Vehicel>(); public ObjektListe() { } } // Objektstruktur als XML speichern private void btnSave_Click(object sender, EventArgs e) { // Root-Objekt erstellen ObjektListe ol = new ObjektListe(); ol.sListenName = "Fahrzeuge"; // zwei Objekte erstellen und in die Liste einfügen ol.Objekte.Add(new Fahrrad()); ol.Objekte.Add(new Auto()); ol.Objekte[0].sName = "Stevens"; ol.Objekte[1].sName = "BMW"; // Stream öffnen FileStream fs = new FileStream("c:\\ObjektListe2.xml", FileMode.Create); // Objekte als XML serialisieren XmlSerializer xs = new XmlSerializer(typeof(ObjektListe)); xs.Serialize(fs, ol); // Stream schließen fs.Flush(); fs.Close(); } // XML Datei laden und Objekte rekonstruieren private void btnLoad_Click(object sender, EventArgs e) { // Stream öffnen FileStream fs = new FileStream("c:\\ObjektListe2.xml", FileMode.Open); // Objekt deserialisieren XmlSerializer xs = new XmlSerializer(typeof(ObjektListe)); ObjektListe ol = xs.Deserialize(fs) as ObjektListe; if (ol != null) { for (int i = 0; i < ol.Objekte.Count; i++) { // Objekte anhand des Basistyps auslesen Vehicel v = ol.Objekte[i]; if (v != null) { string sTyp = "n/a"; // prüfen, ob Objekt einem // best. abgeleiteten Typ entspricht if (v is Auto) { sTyp = "Auto"; } else if (v is Fahrrad) { sTyp = "Fahrrad"; } Console.WriteLine("[" + sTyp + "] " +v.sName); } } } // Stream schließen fs.Close(); }