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
4. June 2008
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
15. June 2009
Hi!
Sehr praktisch
Besonders als Extension von Object!
Danke!