Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
programmieren:java:android:xml:start [2016/02/18 06:41] – [Was tun bei Objektgraphen mit Zyklen?] martin | programmieren:java:android:xml:start [2021/12/29 10:40] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Objekte <-> XML (Serialisierung/ | ||
+ | Im Folgenden wird beschrieben, | ||
+ | Die beschriebene Vorgehensweise deckt nur einen sehr kleinen Funktionsumfang von [[http:// | ||
+ | |||
+ | ===== Aufnahme der Bibliothek ins Projekt ===== | ||
+ | Auf der [[http:// | ||
+ | |||
+ | ===== Model-Klassen ===== | ||
+ | Damit Objekte mit Simple XML serialisiert und deserialisiert werden können, müssen sie mit Annotations versehen werden, die angeben, welche Attribute wie umgewandelt werden sollen. Hier ein Beispiel: | ||
+ | <code java> | ||
+ | @Root | ||
+ | public class Buch { | ||
+ | |||
+ | @Element | ||
+ | private String titel; | ||
+ | |||
+ | @Element | ||
+ | private String autor; | ||
+ | |||
+ | @Element | ||
+ | private int seitenzahl; | ||
+ | |||
+ | public Buch() { | ||
+ | }; | ||
+ | |||
+ | public Buch(String titel, String autor, int seitenzahl) { | ||
+ | super(); | ||
+ | this.titel = titel; | ||
+ | this.autor = autor; | ||
+ | this.seitenzahl = seitenzahl; | ||
+ | } | ||
+ | |||
+ | public String getTitel() { | ||
+ | return titel; | ||
+ | } | ||
+ | |||
+ | public void setTitel(String titel) { | ||
+ | this.titel = titel; | ||
+ | } | ||
+ | |||
+ | public String getAutor() { | ||
+ | return autor; | ||
+ | } | ||
+ | |||
+ | public void setAutor(String autor) { | ||
+ | this.autor = autor; | ||
+ | } | ||
+ | |||
+ | public int getSeitenzahl() { | ||
+ | return seitenzahl; | ||
+ | } | ||
+ | |||
+ | public void setSeitenzahl(int seitenzahl) { | ||
+ | this.seitenzahl = seitenzahl; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String toString() { | ||
+ | |||
+ | return " | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | Die Annotation '' | ||
+ | <code java> | ||
+ | @Root | ||
+ | public class Bibliothek { | ||
+ | |||
+ | @Attribute | ||
+ | private String name; | ||
+ | |||
+ | @ElementList | ||
+ | private List< | ||
+ | |||
+ | public Bibliothek(){}; | ||
+ | |||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Ein beispielhafter Objektbaum sieht so aus: | ||
+ | <code XML> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Code zum Serialisieren ===== | ||
+ | Hier der Code zum Serialisieren: | ||
+ | <code java> | ||
+ | Bibliothek bib = BeispielFactory.getBeispielBibliothek(); | ||
+ | |||
+ | Style style = new HyphenStyle(); | ||
+ | Format format = new Format(style); | ||
+ | | ||
+ | Serializer serializer = new Persister(format); | ||
+ | |||
+ | StringWriter writer = new StringWriter(); | ||
+ | |||
+ | try { | ||
+ | serializer.write(bib, | ||
+ | Log.i(" | ||
+ | |||
+ | } catch (Exception ex){ | ||
+ | ausgabe.setText(ex.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Code zum Deserialisieren ===== | ||
+ | Hier der Code zum Deserialisieren: | ||
+ | <code java> | ||
+ | String xml = ... // Von irgendwoher kommt der XML-Text... | ||
+ | |||
+ | Serializer serializer = new Persister(); | ||
+ | |||
+ | try { | ||
+ | Bibliothek bib = serializer.read(Bibliothek.class, | ||
+ | // bib ist der Knoten des Objektbaums, | ||
+ | } catch (Exception ex){ | ||
+ | ausgabe.setText(ex.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Was tun bei Objektgraphen mit Zyklen? ===== | ||
+ | Das obige Vorgehen funktioniert natürlich nur bei baumförmigen Objektstrukturen. Sobald der Objektgraph Zyklen besitzt, ist eine direkte Umsetzung in einen XML-Baum nicht mehr möglich, weil ein Objekt in mehreren anderen Objekten enthalten sein kann. Hier hält Simple XML eine Lösung bereit: Es versieht alle XML-Objekte mit einem zusätzliche Attribut " | ||
+ | |||
+ | <code java> | ||
+ | Strategy strategy = new CycleStrategy(" | ||
+ | Serializer serializer = new Persister(strategy, | ||
+ | | ||
+ | ... | ||
+ | </ | ||
+ | Ebenso vor dem Deserialisieren: | ||
+ | <code java> | ||
+ | Strategy strategy = new CycleStrategy(" | ||
+ | Serializer serializer = new Persister(strategy); | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Fügt man dem obigen Objektmodell noch eine Klasse '' | ||
+ | <code java> | ||
+ | public class Verlag { | ||
+ | |||
+ | @Element | ||
+ | private String name; | ||
+ | |||
+ | @Element | ||
+ | private String ort; | ||
+ | ... | ||
+ | |||
+ | } | ||
+ | |||
+ | @Root | ||
+ | public class Bibliothek { | ||
+ | |||
+ | @Attribute | ||
+ | private String name; | ||
+ | |||
+ | @ElementList | ||
+ | private List< | ||
+ | |||
+ | @ElementList | ||
+ | private List< | ||
+ | ... | ||
+ | |||
+ | } | ||
+ | |||
+ | @Root | ||
+ | public class Buch { | ||
+ | |||
+ | @Element | ||
+ | private String titel; | ||
+ | |||
+ | @Element | ||
+ | private Verlag verlag; | ||
+ | |||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Ein Beispiel für eine als XML serialisierte Bibliothek sieht dann so aus: | ||
+ | |||
+ | <code XML> | ||
+ | < | ||
+ | < | ||
+ | <buch id=" | ||
+ | < | ||
+ | < | ||
+ | <name id=" | ||
+ | <ort id=" | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | <buch id=" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | <buch id=" | ||
+ | < | ||
+ | < | ||
+ | <name id=" | ||
+ | <ort id=" | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | <verlag ref=" | ||
+ | <verlag ref=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Ausblick ===== | ||
+ | Die Bibliothek Simple XML bietet noch weit mehr Möglichkeiten als oben gezeigt, bspw.: | ||
+ | * XML-Elementnamen, | ||
+ | * Optionale XML-Elemente | ||
+ | * Möglichkeit, | ||
+ | * Möglichkeit, | ||
+ | * Transiente Attribute (d.h. Attribute, die nicht serialisiert werden) | ||
+ | * Aufruf bestimmter Methoden vor dem Serialisieren bzw. nach dem Serialisieren der Objekte | ||
+ | * Serialisieren von Maps | ||
+ | * Einfach Implementierung einer XML-basierten Template Engine | ||
+ | * ... | ||
+ | |||
+ | |||
+ | |||