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"));

2 Kommentare bisher »

  1. 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

  2. chris sagt

    am 15. Juni 2009 @ 13:20

    Hi!

    Sehr praktisch :) Besonders als Extension von Object!

    Danke!

Komentar RSS · TrackBack URI

Hinterlasse einen Kommentar

Name: (erforderlich)

eMail: (erforderlich)

Website:

Kommentar: