HowTo: Generisches speichern und laden von XML Dateien bzw. wozu sind Generics gut?
Immmer wenn ich eine Xml Datei lesen oder schreiben will fange ich wieder an das Code-Snippet dafür zu suchen und an meine Objekttypen anzupassen. Also habe ich mir jetzt mal eine generische Version geschrieben. Das T steht dabei für den noch unbekannten Typ der erst zur Laufzeit übergeben wir.
public static void Save<T>(String path, T obj)
{
XmlSerializer Serializer = new XmlSerializer(typeof(T));
FileStream Stream = new FileStream(path, FileMode.Create);
Serializer.Serialize(Stream, obj);
Stream.Close();
}
public static T Load<T>(String path)
{
XmlSerializer Serializer = new XmlSerializer(typeof(T));
StreamReader Stream = new StreamReader(path);
T myObject = (T)Serializer.Deserialize(Stream);
Stream.Close();
return myObject;
}
Der Zugriff erfolgt so:
// Daten
String TestString = "Hallo Xml Welt";
//schreiben..
Save<String>("C:\\test.xml", TestString);
//und lesen
Debug.WriteLine(Load<String>("C:\\test.xml"));

























Andre Loker sagt
am 4. Juni 2008 @ 11:33
In einer Anwendung, in der man das oft braucht, könnte man auch gut extension methods einsetzen:
public static void SaveXml(this T obj, String path){
// usw.
}
Verwendung:
String TestString = “Hallo Xml Welt”;
TestString.SaveXml(”c:\\test.xml”);
Anzumerken bliebe noch, dass das explizite Typargument nur dann benötigt wird, wenn man nur den Basisklassen-Anteil eines Objektes serialisieren will, also etwa:
class Fahrzeug{}
class PKW : Fahrzeug{}
var pkw = new PKW();
// komplett speichern
Save(”pkw.xml”, pkw);
bzw.
pkw.SaveXml(”pkw.xml”);
// nur Fahrzeug Anteil speichern
Save(”fahrzeug.xml”, pkw);
bzw;
pkw.SaveXml(”fahrzeug.xml”);
Ob das wirklich benötigt wird, hängt wohl vom Anwendungsfall ab. Will man das komplette Objekt speichern, kann der compiler das Typargument ableiten.
Grüße,
Andre
chris sagt
am 15. Juni 2009 @ 13:20
Hi!
Sehr praktisch
Besonders als Extension von Object!
Danke!