Mit ‘dom4j’ getaggte Artikel

XStream: Object -> XML -> Object

Donnerstag, 19. November 2009

Mit der Bibliothek XStream lassen sich auf einfache Weise Java Objekte in XML zu serialisieren und wieder zurück.
Das kann z.B. dazu dienen, Datensätze als Textdatei abzuspeichern oder XML für Unit-Tests zu erzeugen.
Vorteile von XStream sind die sehr einfache Anwendung und die gute Performance. Neuere Versionen von XStream bieten zudem die Möglichkeit auch JSON zu erzeugen oder die Integration in andere XML APIs.

Nun ein paar Beispiele zur Verwendung von XStream.

XStream verwendet per default die Pull-Parser Implementierung XPP3. Das entsprechende JAR muss hierzu separat heruntergeladen und im Classpath hinzugefügt werden. (Die XPP3 Implementierung am Besten über eine Suchmaschine im Internet suchen.)

Anmerkung:
Wir verwenden hier Aliase für Klassennamen. Das hat den Vorteil, dass das XML lesbarer wird und vor allem eine Deserialisierung auch nach einem Umbenennen oder Verschieben der Klasse funktioniert.

Objekt nach XML serialisieren

  final XStream xstream = new XStream();
  // set alias for the MyData class 
  xstream.alias("my-data", MyData.class);
  // MyData myData = new MyData(....);
  final String xml = xstream.toXML(myData);

Objekt aus XML deserialisieren

  final XStream xstream = new XStream();
  // set alias for the MyData class 
  xstream.alias("my-data", MyData.class);
  // String xml = 
  MyData myData = (MyData) xstream.fromXML(xml);

Interaktion mit dom4J

Mit XStream lassen sich auch Objekte in ein bestehendes XML Document einfügen. In diesem Beispiel wird ein dom4j Element ermittelt und an die Methode addToElement() übergeben, welche das Objekt myData in das Element serialisiert:

  public void addToElement(final MyData myData, final org.dom4j.Element element) {
    final XStream xstream = new XStream();
    xstream.alias("my-data", MyData.class);
    // create new com.thoughtworks.xstream.io.xml.Dom4JWriter
    final Dom4JWriter writer = new Dom4JWriter(element);
    xstream.marshal(myData, writer);
    writer.close();
  }

Natürlich ist der Weg zurück zum Objekt aus dem XML genauso einfach:

  public MyData getFromElement(final org.dom4j.Element element) {
    final XStream xstream = new XStream();
    xstream.alias("my-data", MyData.class);
    final Dom4JReader reader = new Dom4JReader(element);
    return (MyData) xstream.unmarshal(reader);
  }

Viel Spaß und Erfolg beim Ausprobieren und Anwenden.


Christof Aenderl