Serialisierung abgeleiteter Klassen nach XML

  • 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();
}