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