Ich habe XStream noch nicht verwendet, aber ich habe Hibernate-verwalteten Entitäten serialisiert. Es macht keinen Spaß.
Es gibt zwei große Probleme:
- Lazy Loading;
- Eins-zu-viele-Beziehungen.
Die erste ist offensichtlich - Sie brauchen die eigentlichen Daten zu serialisieren. Letzteres ist weniger der Fall - alle Eins-zu-Viele-Beziehungen, die Sie gegen Sammelschnittstellen deklarieren (zB: Set<T>
), werden von Hibernate's eigenen (unserialisierbaren!) Sammlungsimplementierungen verstopft. Dies kann gut sein, wo Hibernate's Klassen in Ihre Objekte bluten.
ich reflektierenden Code endete schriftlich (tatsächlich introspektiv), die dies taten:
- Mit der Sitzung geöffnet, berühren das gesamte Objekt Diagramm, um zwang zu laden alle entladen Einheiten;
- Die Hibernate-Sitzung geschlossen (einschließlich aller Transaktionen, die die Verbindung betreffen);
- Ging das Objektdiagramm, ersetzt alle Listen, Sets oder Maps mit Instanzen von ArrayList, HashSet oder HashMap (bekannt-serialisierbaren Sammlungen).
Beachten Sie, dass 2 Schritt ist wichtig - wenn Sie die Sammlungen Schließen der Sitzung vor ersetzen, Hibernate nur seine eigenen Sammlungen gleich wieder auf schließen ...
Edit: @ cliff.meyers entdeckte ein Detail der Implementierung, die ich vergessen habe zu erwähnen: Wenn Sie dies tun, müssen Sie das Objektgraph-Gehen nur auf Ihre eigenen Entitäten beschränken und nach zirkulären Referenzpfaden suchen (z. B. indem Referenzen auf Objekte, die Sie bereits betreten haben, zwischengespeichert werden).
Vielleicht könnten Sie zeigen, wie das XML aussieht? –