Was ist JAXB und warum sollte ich es verwenden? [geschlossen]
109
Hier schwört ein Typ, dass JAXB das Beste seit geschnittenem Brot ist. Ich bin gespannt, was Stack Overflow-Benutzer für den Anwendungsfall von JAXB halten und was ihn zu einer guten oder schlechten Lösung für diesen Fall macht.
Ich bin ein großer Fan von JAXB für die Manipulation von XML. Grundsätzlich bietet es eine Lösung für dieses Problem (ich gehe davon aus, dass Sie mit XML, Java-Datenstrukturen und XML-Schemas vertraut sind):
Die Arbeit mit XML ist schwierig. Man braucht eine Möglichkeit, eine XML-Datei - im Grunde genommen eine Textdatei - in eine Datenstruktur zu konvertieren, die Ihr Programm dann bearbeiten kann.
JAXB verwendet ein von Ihnen geschriebenes XML-Schema und erstellt eine Reihe von Klassen, die diesem Schema entsprechen. Die JAXB-Dienstprogramme erstellen die Hierarchie der Datenstrukturen für die Bearbeitung dieses XML.
JAXB kann dann verwendet werden, um eine XML-Datei zu lesen und dann Instanzen der generierten Klassen zu erstellen - beladen mit den Daten aus Ihrem XML. JAXB macht auch das Gegenteil: Nimmt Java-Klassen und generiert das entsprechende XML.
Ich mag JAXB, weil es einfach zu bedienen ist und mit Java 1.6 geliefert wird (wenn Sie 1.5 verwenden, können Sie die JAXB-JARs herunterladen.) Die Art und Weise, wie die Klassenhierarchie erstellt wird, ist intuitiv und leistet meiner Erfahrung nach gute Arbeit das "XML" weg abstrahieren, damit ich mich auf "Daten" konzentrieren kann.
Um Ihre Frage zu beantworten: Ich würde erwarten, dass JAXB für kleine XML-Dateien möglicherweise übertrieben ist. Dazu müssen Sie ein XML-Schema erstellen und verwalten sowie "Standardlehrbuchmethoden" zur Verwendung von Java-Klassen für Datenstrukturen verwenden. (Hauptklassen, kleine innere Klassen zur Darstellung von "Knoten" und eine große Hierarchie von ihnen.) JAXB eignet sich daher wahrscheinlich nicht so gut für eine einfache lineare Liste von "Einstellungen" für eine Anwendung.
Wenn Sie jedoch ein ziemlich komplexes XML-Schema und viele darin enthaltene Daten haben, ist JAXB fantastisch. In meinem Projekt habe ich große Datenmengen zwischen Binärdaten (die von einem C-Programm verwendet wurden) und XML konvertiert (damit Menschen diese Daten verwenden und ändern können). Das resultierende XML-Schema war nicht trivial (viele Hierarchieebenen, einige Felder konnten wiederholt werden, andere nicht), daher war JAXB hilfreich, um dies zu manipulieren.
JAXB ist eine Spezifikation (wie JPA oder JAXP), was bedeutet, dass es mehrere Implementierungen gibt (Metro, EclipseLink usw.). Wenn Sie ein Problem mit einem haben, können Sie zu einer anderen Implementierung wechseln. Sie können auch Erweiterungen nutzen, die von verschiedenen Anbietern angeboten werden.
Bdoughan
@BlaiseDoughan, Metro ist eine JAXB-Implementierung ?! Ist Metro nicht eine WSIT-Implementierung?
Muhammad Gelbana
1
@MuhammadGelbana - Ich denke, ich sollte es als Projekt JAXB ( jaxb.java.net ) bezeichnen, das Teil der JAX-WS-Implementierung von Metro ( metro.java.net ) ist.
Hier ist ein Grund, es nicht zu verwenden: Die Leistung leidet. Beim Marshalling und Unmarshaling entsteht viel Overhead. Möglicherweise möchten Sie auch eine andere API für die XML-Objektbindung in Betracht ziehen, z. B. JiBX:
http://jibx.sourceforge.net/
Erwägen Sie auch die Verwendung des Tools XSD2Jibx, wenn Sie Probleme mit Bindungen haben - es befindet sich im Status "Alpha", aber es ist sehr hilfreich, die Klassen und Bindungen zu veranschaulichen, die es mit XSD-Schemas mag ... jetzt, wenn es standardmäßig nicht mehr SQL-Datum verwendet und verwendet stattdessen Java util Date ...
MetroidFan2002
3
Bullshit. JAXB ist ziemlich schnell, solange Sie einen schnellen Parser (wie Woodstox) verwenden, mit einem Overhead von vielleicht 30-40% im Vergleich zur manuellen Bindung. JiBX ist in Ordnung, kein Problem, aber der Leistungsunterschied ist nicht groß.
StaxMan
6
Ich habe JAXB in mehreren Projekten verwendet und verwende es weiterhin. Es ist jedoch wichtig zu verstehen, wie es mit anderen Frameworks verglichen wird. Wenn Sie Dokumente mit Hunderten von Megabyte zusammenstellen / abstellen und Zeit wichtig ist, ist JiBX eine gute Alternative. JAXB == Reflection, JiBX == Bytecode-Instrumentierung.
Codefinger
19
Es ist ein "ORM für XML". Wird am häufigsten zusammen mit JAX-WS (und tatsächlich werden die Sun-Implementierungen gemeinsam entwickelt) für WS-Todessternsysteme verwendet.
Ich benutze JAXB die ganze Zeit bei der Arbeit und ich liebe es wirklich. Es ist perfekt für komplexe XML-Schemas, die sich ständig ändern, und besonders gut für den wahlfreien Zugriff auf Tags in einer XML-Datei.
Ich hasse es zu pimpen, aber ich habe gerade einen Blog gestartet und dies ist buchstäblich das erste, worüber ich geschrieben habe!
Dies sind keine verbindlichen Frameworks, sondern Serialisierungsbibliotheken. Ein gutes Bindungsframework kann jedes XML einem isomorphen Objektgraphen oder wieder zurück zuordnen. Diese einfachen Serialisierungsmechanismen erzeugen und verbrauchen ein festes, nicht standardmäßiges XML-Schema.
erickson
Danke erickson, ich habe nur mit JAXB gearbeitet und wollte sicherstellen, dass ich Alternativen erwähne. Ich werde meine Antwort basierend auf Ihrer Eingabe bearbeiten.
Fabian Steeg
Obwohl XStream in Ordnung ist, ist es nicht wirklich einfacher, da beide sehr einfach sind. Und Digester ist NICHT einfach, nur simpel.
StaxMan
2
Jemand erwähnt JAXB-2.0 bitte mit Anmerkungen. Zwischen einigen XmlAdapter-Klassen kann ich jedes Schema einer vorhandenen Java-Struktur zuordnen.
Mark Renouf
8
JAXB ist großartig, wenn Sie nach einer externen XML-Spezifikation codieren müssen, die als XML-Schema ( xsd) definiert ist.
Zum Beispiel haben Sie eine Handelsanwendung und müssen die Trades an die Uber Lame Trade Reporting App melden, die Ihnen ultra.xsddie Möglichkeit gegeben hat , weiterzumachen. Verwenden Sie den $JAVA_HOME/bin/xjcCompiler, um das XML in eine Reihe von Java-Klassen umzuwandeln (z UltraTrade. B. ).
Dann können Sie einfach eine einfache Adapterschicht schreiben , um Ihre Handelsobjekte in Ultra-Corp zu konvertieren UltraTradesund JAXBdie Daten zu verwenden. Viel einfacher als die Konvertierung Ihrer Trades in das XML-Format.
Alles bricht zusammen, wenn Ultra-Corp ihre eigenen Spezifikationen nicht eingehalten hat und der Handel, priceden sie als a haben, xsd:floateigentlich als a ausgedrückt werden sollte double!
Beachten Sie auch, dass Sie Code zuerst ausführen können: Beginnen Sie mit Beans und generieren Sie ein Schema, wenn Sie es benötigen.
StaxMan
7
Warum brauchen wir JAXB?
Die Remote-Komponenten (in Java geschrieben) von Webdiensten verwenden XML als Mittel zum Austausch von Nachrichten untereinander. Warum XML? Weil XML als einfache Option zum Austausch von Nachrichten in Netzwerken mit begrenzten Ressourcen angesehen wird. So oft müssen wir diese XML-Dokumente in Objekte konvertieren und umgekehrt. Beispiel: Mit Simple Java POJO Employee können Mitarbeiterdaten an eine Remote-Komponente (auch ein Java-Programm) gesendet werden.
classEmployee{String name;String dept;....}
Dieses Pojo sollte wie folgt in ein XML-Dokument konvertiert werden (Marshall):
Und an der Remote-Komponente zurück zum Java-Objekt aus dem XML-Dokument (Un-Marshall).
Was ist JAXB?
JAXB ist eine Bibliothek oder ein Tool zum Ausführen dieser Operation von Marshalling und UnMarshalling. Es erspart Ihnen diese Kopfschmerzen, so einfach ist das.
Sie können auch JIBX ausprobieren. Es ist auch ein sehr guter XML-Datenordner, der ebenfalls auf OTA (Open Travel Alliance) spezialisiert ist und von AXIS2-Servern unterstützt wird. Wenn Sie nach Leistung und Kompatibilität suchen, können Sie Folgendes ausprobieren:
JAXB bietet eine verbesserte Leistung durch Standard-Marshalling-Optimierungen. JAXB definiert eine Programmierer-API zum Lesen und Schreiben von Java-Objekten in und aus XML-Dokumenten, wodurch das Lesen und Schreiben von XML über Java vereinfacht wird.
Antworten:
Ich bin ein großer Fan von JAXB für die Manipulation von XML. Grundsätzlich bietet es eine Lösung für dieses Problem (ich gehe davon aus, dass Sie mit XML, Java-Datenstrukturen und XML-Schemas vertraut sind):
Die Arbeit mit XML ist schwierig. Man braucht eine Möglichkeit, eine XML-Datei - im Grunde genommen eine Textdatei - in eine Datenstruktur zu konvertieren, die Ihr Programm dann bearbeiten kann.
JAXB verwendet ein von Ihnen geschriebenes XML-Schema und erstellt eine Reihe von Klassen, die diesem Schema entsprechen. Die JAXB-Dienstprogramme erstellen die Hierarchie der Datenstrukturen für die Bearbeitung dieses XML.
JAXB kann dann verwendet werden, um eine XML-Datei zu lesen und dann Instanzen der generierten Klassen zu erstellen - beladen mit den Daten aus Ihrem XML. JAXB macht auch das Gegenteil: Nimmt Java-Klassen und generiert das entsprechende XML.
Ich mag JAXB, weil es einfach zu bedienen ist und mit Java 1.6 geliefert wird (wenn Sie 1.5 verwenden, können Sie die JAXB-JARs herunterladen.) Die Art und Weise, wie die Klassenhierarchie erstellt wird, ist intuitiv und leistet meiner Erfahrung nach gute Arbeit das "XML" weg abstrahieren, damit ich mich auf "Daten" konzentrieren kann.
Um Ihre Frage zu beantworten: Ich würde erwarten, dass JAXB für kleine XML-Dateien möglicherweise übertrieben ist. Dazu müssen Sie ein XML-Schema erstellen und verwalten sowie "Standardlehrbuchmethoden" zur Verwendung von Java-Klassen für Datenstrukturen verwenden. (Hauptklassen, kleine innere Klassen zur Darstellung von "Knoten" und eine große Hierarchie von ihnen.) JAXB eignet sich daher wahrscheinlich nicht so gut für eine einfache lineare Liste von "Einstellungen" für eine Anwendung.
Wenn Sie jedoch ein ziemlich komplexes XML-Schema und viele darin enthaltene Daten haben, ist JAXB fantastisch. In meinem Projekt habe ich große Datenmengen zwischen Binärdaten (die von einem C-Programm verwendet wurden) und XML konvertiert (damit Menschen diese Daten verwenden und ändern können). Das resultierende XML-Schema war nicht trivial (viele Hierarchieebenen, einige Felder konnten wiederholt werden, andere nicht), daher war JAXB hilfreich, um dies zu manipulieren.
quelle
Hier ist ein Grund, es nicht zu verwenden: Die Leistung leidet. Beim Marshalling und Unmarshaling entsteht viel Overhead. Möglicherweise möchten Sie auch eine andere API für die XML-Objektbindung in Betracht ziehen, z. B. JiBX: http://jibx.sourceforge.net/
quelle
Es ist ein "ORM für XML". Wird am häufigsten zusammen mit JAX-WS (und tatsächlich werden die Sun-Implementierungen gemeinsam entwickelt) für WS-Todessternsysteme verwendet.
quelle
Ich benutze JAXB die ganze Zeit bei der Arbeit und ich liebe es wirklich. Es ist perfekt für komplexe XML-Schemas, die sich ständig ändern, und besonders gut für den wahlfreien Zugriff auf Tags in einer XML-Datei.
Ich hasse es zu pimpen, aber ich habe gerade einen Blog gestartet und dies ist buchstäblich das erste, worüber ich geschrieben habe!
Schau es dir hier an:
http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/
quelle
Mit JAXB können Sie automatisch XML-Darstellungen Ihrer Objekte (Marshalling) und Objektdarstellungen des XML (Unmarshalling) erstellen.
In Bezug auf das XML-Schema haben Sie zwei Möglichkeiten:
Es gibt auch einige einfachere XML-Serialisierungsbibliotheken wie XStream , Digester oder XMLBeans , die Alternativen sein könnten.
quelle
JAXB ist großartig, wenn Sie nach einer externen XML-Spezifikation codieren müssen, die als XML-Schema (
xsd
) definiert ist.Zum Beispiel haben Sie eine Handelsanwendung und müssen die Trades an die Uber Lame Trade Reporting App melden, die Ihnen
ultra.xsd
die Möglichkeit gegeben hat , weiterzumachen. Verwenden Sie den$JAVA_HOME/bin/xjc
Compiler, um das XML in eine Reihe von Java-Klassen umzuwandeln (zUltraTrade
. B. ).Dann können Sie einfach eine einfache Adapterschicht schreiben , um Ihre Handelsobjekte in Ultra-Corp zu konvertieren
UltraTrades
undJAXB
die Daten zu verwenden. Viel einfacher als die Konvertierung Ihrer Trades in das XML-Format.Alles bricht zusammen, wenn Ultra-Corp ihre eigenen Spezifikationen nicht eingehalten hat und der Handel,
price
den sie als a haben,xsd:float
eigentlich als a ausgedrückt werden solltedouble
!quelle
Warum brauchen wir JAXB? Die Remote-Komponenten (in Java geschrieben) von Webdiensten verwenden XML als Mittel zum Austausch von Nachrichten untereinander. Warum XML? Weil XML als einfache Option zum Austausch von Nachrichten in Netzwerken mit begrenzten Ressourcen angesehen wird. So oft müssen wir diese XML-Dokumente in Objekte konvertieren und umgekehrt. Beispiel: Mit Simple Java POJO Employee können Mitarbeiterdaten an eine Remote-Komponente (auch ein Java-Programm) gesendet werden.
Dieses Pojo sollte wie folgt in ein XML-Dokument konvertiert werden (Marshall):
Und an der Remote-Komponente zurück zum Java-Objekt aus dem XML-Dokument (Un-Marshall).
Was ist JAXB?
JAXB ist eine Bibliothek oder ein Tool zum Ausführen dieser Operation von Marshalling und UnMarshalling. Es erspart Ihnen diese Kopfschmerzen, so einfach ist das.
quelle
Sie können auch JIBX ausprobieren. Es ist auch ein sehr guter XML-Datenordner, der ebenfalls auf OTA (Open Travel Alliance) spezialisiert ist und von AXIS2-Servern unterstützt wird. Wenn Sie nach Leistung und Kompatibilität suchen, können Sie Folgendes ausprobieren:
http://jibx.sourceforge.net/index.html
quelle
JAXB bietet eine verbesserte Leistung durch Standard-Marshalling-Optimierungen. JAXB definiert eine Programmierer-API zum Lesen und Schreiben von Java-Objekten in und aus XML-Dokumenten, wodurch das Lesen und Schreiben von XML über Java vereinfacht wird.
quelle