Was sind die relativen Vorteile von XMLEncoder und XStream?

Angenommen, ich möchte viele kleine Konfigurationsobjekte in xml speichern, und mir ist das Format egal. Die XMLDecoder Klasse wurde in die JDK würde funktionieren, und von dem, was ich höre, funktioniert XStream in ähnlicher Weise.

Was sind die Vorteile für jede Bibliothek?

0

8 Antworten

Ich finde XStream immer sehr verlockend, weil es so einfach ist, loszulegen. Aber ich ersetze es ausnahmslos. Es ist wirklich ziemlich buggy, und seine Sammlung Handhabung könnte eine Menge Arbeit brauchen.

Daher wechsle ich normalerweise zu JAXB. Es ist sehr viel robuster, es ist ziemlich fehlerfrei und flexibler als XStream.

0
hinzugefügt
Welche Fehler gibt es in XStream?
hinzugefügt der Autor Marcus Leon, Quelle

Noch ein Vorschlag: JAXB ( http://jaxb.dev.java.net ) zu erwägen. Wenn Sie JDK 1.6 verwenden, wird es gebündelt geliefert. Weitere Informationen finden Sie unter "javax.xml.bind". Zusätzliche externe JARs sind nicht erforderlich.

JAXB ist ziemlich schnell. Ich mag XStream auch, aber es ist etwas langsamer. Außerdem ist XMLEncoder ein bisschen wie ein Spielzeug (verglichen mit anderen Optionen) ... aber wenn es funktioniert, schadet es nicht, es zu benutzen.

Außerdem: Ein Vorteil von JAXB ist, dass Sie damit auch Teildokumente (Teilbäume) binden können; Es müssen keine Objekte für die gesamte Datei erstellt werden. Dazu müssen Sie Stax (XMLStreamReader) verwenden, um auf das Wurzelelement des Unterbaums zu zeigen, und dann binden. Keine Notwendigkeit, SAX zu verwenden, selbst für die meisten großen Dateien, solange es Stück für Stück verarbeitet werden kann.

0
hinzugefügt
Danke für den Vorschlag. Ich mache eine Unterscheidung zwischen Bindung und Serialisierung, und diese Frage ist auf Serialisierung ausgerichtet. Sie erwähnen jedoch, dass XMLEncoder ein Spielzeug im Vergleich zu den anderen ist. Könnten Sie bitte einige Besonderheiten von XStream nennen, die in XMLEncoder fehlen?
hinzugefügt der Autor erickson, Quelle
Meinetwegen. In den meisten Fällen funktioniert die datenbindungsbasierte Serialisierung problemlos. Und ich habe nichts gesehen, was darauf hinwies, dass JAXB nicht funktionieren würde. Wrt toy: fehlende Konfigurierbarkeit, schreibt nur Beans (nicht feldbasiert), XML-Integration (XE verwendet String concat, nicht XML-Writer), Performance.
hinzugefügt der Autor StaxMan, Quelle

Wenn Sie planen, all diese Konfigurationsobjekte in einer einzigen Datei zu speichern, und diese Datei sehr groß ist, können beide oben beschriebenen Optionen ziemlich speicherintensiv sein, da beide die gesamte Datei in den Speicher einlesen müssen deserialisiert werden.

Wenn die Speichernutzung ein Problem darstellt (die Datei mit dem xml wird sehr groß sein), empfehle ich SAX .

Wenn die Speicherbelegung keine Rolle spielt (die Datei mit dem xml wird nicht sehr groß sein), würde ich alles verwenden, was in der Standard-JRE enthalten ist (in diesem Fall XMLDecoder), nur um Abhängigkeiten von Drittanbietern zu entfernen.

0
hinzugefügt
Der springende Punkt ist genau, Objekte in den Speicher zu laden. Es ist ein Deserialisierungsmechanismus. Was ich vermeiden möchte, ist, ein DOM zu konstruieren und es dann zu einem parallelen Objektgraphen zu führen, weil ich dann unnötigerweise zwei Kopien im Speicher habe. XMLDecoder ist mindestens SAX-basiert.
hinzugefügt der Autor erickson, Quelle

Ich würde auch XStream bevorzugen, da es wirklich einfach zu verwenden und zu erweitern ist. Sie können schnell starten, wenn Sie mit dem Standard-Setup gehen. Wenn Sie das Verhalten anpassen müssen, hat es eine sehr saubere API und viele Erweiterungspunkte, so dass Sie wirklich fein abgestimmte Kontrolle über die Dinge haben, die Sie optimieren möchten, ohne andere Teile des Marshalling-Prozesses zu stören.

Da das XML, das von XStream erstellt wird, gut aussieht, ist auch die manuelle Bearbeitung einfach. Wenn die Ausgabe Ihre Anforderungen nicht erfüllt und die lange Liste der verfügbaren Konverter nicht enthält das, was du brauchst, ist ziemlich einfach, dein eigenes zu schreiben.

Ein großes Plus ist auch die gute Dokumentation auf ihrer Homepage .

0
hinzugefügt

Sie sollten XMLEncoder/XMLDecoder wie die Pest vermeiden, wenn Sie eine nicht-triviale Anzahl von Objekten beibehalten wollen oder Ihr System Multithread sein muss. Siehe http://matthew.mceachen.us/blog/do -not-want-xmllencoder-129.html für die grausigen Details.

Wenn Sie xml verwenden müssen, ist XStream großartig. Aber fragen Sie sich, ob Sie wirklich xml verwenden müssen. Hier ist ein Serialisierungs-Benchmark-Projekt, das Sie zu besseren Lösungen führen könnte:

http://code.google.com/p/thrift-protobuf- vergleiche/wiki/Benchmarking

0
hinzugefügt

Java hat auch eine neue Utility-Klasse, die darauf abzielt, Key-Value-gepaarte Sets zu speichern, die für Konfigurationen typisch sind. Es ist der alte Stil, aber sehr einfach und praktisch. Dies geschieht über die java.util.Properties class, ein Map-Objekt mit Serialisierungsoptionen. Dies kann alles sein, was Sie brauchen, wenn Sie nicht ganze Objekte speichern.

0
hinzugefügt

Ich mag den XStream Bibliothek. Es ist eine wirklich gute Aufgabe, ziemlich einfache xml auszugeben als Ergebnis eines bereitgestellten Java-Objekts. Es funktioniert hervorragend für die Wiedergabe das Objekt auch von der xml zurück. Und, eine unserer 3rd-Party-Bibliotheken war ohnehin schon davon abhängig.

  • Wir haben es gewählt, weil wir es wollten unser xml soll lesbar sein. Verwenden die Alias-Funktion macht es sehr schöner.

  • Sie können die Bibliothek erweitern, wenn Sie möchte etwas von einem Objekt haben auf eine schönere Art deserialisieren. Wir Habe das in einem Fall also die Datei würde eine Reihe von Graden haben, Minuten und Sekunden für einen Breitengrad und Längengrad statt zwei verdoppelt sich.

Das zweiminütige Tutorial fasst die grundlegende Verwendung zusammen, aber in der Interesse, die Informationen an einem Ort zu halten, werde ich versuchen, es zusammenzufassen hier oben, nur ein bisschen kürzer.

// define your classes
public class Person {
  private String firstname;
  private PhoneNumber phone;
 //... constructors and methods
}

public class PhoneNumber {
  private int code;
  private String number;
 //... constructors and methods
}

Dann benutze die Bibliothek, um das xml auszugeben.

// initial the libray
XStream xstream = new XStream();
xstream.alias("person", Person.class);//elementName, Class
xstream.alias("phone", PhoneNumber.class); 

// make your objects
Person joe = new Person("Joe");
joe.setPhone(new PhoneNumber(123, "1234-456"));

// convert xml
String xml = xstream.toXML(joe);

Ihre Ausgabe wird wie folgt aussehen:


  Joe
  
    123
    1234-456
  

Zurück zu gehen:

Person newJoe = (Person)xstream.fromXML(xml);

Der XMLEncoder wird für die Java-Bean-Serialisierung bereitgestellt. Das letzte Mal, als ich es benutzt habe, Die Datei sah ziemlich ekelhaft aus. Wenn es wirklich egal ist, wie die Datei aussieht, könnte es sein arbeite für dich und du vermeidest eine Abhängigkeit von Dritten, was auch nett ist. Ich würde erwarten, dass die Möglichkeit, die Serialisierung schöner zu machen, auch mit dem XMLEncoder eine Herausforderung darstellen würde.

XStream gibt den vollständigen Klassennamen aus, wenn Sie den Namen nicht als Aliasnamen angeben. Wenn die obige Personenklasse hätte

package example;
the xml would have "example.Person" instead of just "person".
0
hinzugefügt
Der "böse" Aspekt des XMLEncoder-Ausgangs sind hauptsächlich die voll qualifizierten Klassennamen. Wenn ich keine Aliase einrichten möchte, was macht XStream mit Paketnamen? Ich habe viele Arten; Klassenspezifischer Code muss minimiert werden. Wie würde ich eine generische XSLT schreiben, um einen beliebigen XStreamed-Typ in JSON umzuwandeln?
hinzugefügt der Autor erickson, Quelle
Das ist der gute Teil. JSON gibt bereits an JSON aus . Ist es das was du willst?
hinzugefügt der Autor Jorge Ferreira, Quelle
Ich bin mir nicht sicher, wie Sie eine XSLT schreiben würden, um von der XStream-Ausgabe zu JSON zu gelangen. Sie könnten eine neue Frage zu SO stellen. :)
hinzugefügt der Autor Jay R., Quelle

Zusatz zu @jay Antwort mit Beispiel:

Code:

PortfolioAlternateIdentifier identifier = new PortfolioAlternateIdentifier();
identifier.setEffectiveDate(new Date());
identifier.setSchemeCode("AAA");
identifier.setIdentifier("123456");

Die Ausgabe mit XStream:


 2014-05-02 20:14:15.961 IST
 AAA
 123456
   

Die Ausgabe mit XMLEncoder:

<?xml version="1.0" encoding="UTF-8"?> 
  
    
      1399041855961    123456   AAA   
 
0
hinzugefügt