JAXBとは何ですか?なぜそれを使用するのですか?[閉まっている]


109

スライスされたパン以来、JAXBが最も優れていると断言する人がいます。Stack OverflowのユーザーがJAXBのユースケースをどのように考えているのか、そしてそれがそのケースの良いソリューションまたは悪いソリューションになる理由を知りたいです。


2
この記事(XMLバインディング用のJavaアーキテクチャー(JAXB))をお読みください。URL:oracle.com/technetwork/articles/javase/index-140168.html#unmars

回答:


99

私はXMLを操作するためのJAXBの大ファンです。基本的に、これはこの問題の解決策を提供します(私はXML、Javaデータ構造、およびXMLスキーマに精通していることを前提としています)。

XMLでの作業は困難です。XMLファイル(基本的にはテキストファイル)を取得して、プログラムで操作できる何らかのデータ構造に変換する方法が必要です。

JAXBはXMLスキーマを取得して、そのスキーマに対応する一連のクラスを作成します。JAXBユーティリティは、そのXMLを操作するためのデータ構造の階層を作成します。

次に、JAXBを使用してXMLファイルを読み取り、生成されたクラスのインスタンスを作成できます-XMLからのデータが含まれています。JAXBは逆も行います。Javaクラスを受け取り、対応するXMLを生成します。

JAXBは使いやすく、Java 1.6が付属しているため、私はJAXBが好きです(1.5を使用している場合は、JAXB .jarをダウンロードできます)。クラス階層を作成する方法は直感的で、私の経験では、きちんとした仕事をしています「XML」を抽象化して、「データ」に集中できるようにします。

だからあなたの質問に答える:小さなXMLファイルの場合、JAXBはやり過ぎかもしれないと思います。XMLスキーマを作成して維持し、データ構造にJavaクラスを利用する「標準の教科書メソッド」を使用する必要があります。(メインクラス、「ノード」を表す小さな内部クラス、およびそれらの巨大な階層。)したがって、JAXBは、アプリケーションの「設定」の単純な線形リストにはおそらくそれほど優れていません。

しかし、かなり複雑なXMLスキーマがあり、その中に大量のデータが含まれている場合、JAXBは素晴らしいです。私のプロジェクトでは、大量のデータをバイナリ(Cプログラムで使用)とXML(人間がそのデータを使用および変更できるようにする)の間で変換していました。結果のXMLスキーマは重要なものでした(階層の​​多くのレベル、一部のフィールドは繰り返すことができ、他のフィールドはできません)。そのため、JAXBはそれを操作するのに役立ちました。


21
JAXBはXSDなしで実行できます。アノテーションを使用できます:jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger 2009

7
JAXBは仕様(JPAやJAXPなど)であり、複数の実装(Metro、EclipseLinkなど)があることを意味します。1つに問題がある場合は、別の実装に切り替えることができます。さまざまなベンダーが提供する拡張機能を利用することもできます。
bdoughan 2010

@ BlaiseDoughan、MetroはJAXB実装ですか?MetroはWSIT実装ではありませんか?
Muhammad Gelbana 2013

1
@MuhammadGelbana- Metro JAX-WS実装(metro.java.net)の一部であるProject JAXB(jaxb.java.net)と呼ぶべきだと思います。
bdoughan 2013

2
参考までに、JAXBはJava SE 11から削除されます。JEP320:Remove the Java EE and CORBA Modulesを参照してください。このアクションは、Java SEモジュール化、およびJava EEテクノロジーのJakarta EEプロジェクトへの引き渡しの一部として行われています。JAXB APIと実装をプロジェクトに追加する必要があります。
バジルブルク

23

これを使用しない理由は次のとおりです。パフォーマンスが低下します。マーシャリングとマーシャリング解除の際にはかなりのオーバーヘッドがあります。あなたはまた、XML-オブジェクトを結合するための別のAPIを検討する必要があります-などJiBXのよう: http://jibx.sourceforge.net/


1
バインディングに問題がある場合は、ツールXSD2Jibxの使用も検討してください。これは「アルファ」ステータスですが、XSDスキーマで好きなクラスとバインディングを示すのに非常に役立ちます。デフォルトでSQL日付の使用をやめた場合のみです。 、および代わりにJava util Dateを使用...
MetroidFan2002

3
でたらめ。JAXBは(Woodstoxのような)高速パーサーを使用している限り、かなり高速であり、手動バインディングに比べてオーバーヘッドがおそらく30〜40%です。JiBXは問題ありませんが、パフォーマンスの違いはそれほど大きくありません。
StaxMan 2009年

6
いくつかのプロジェクトでJAXBを使用しており、引き続き使用しています。ただし、他のフレームワークとの比較を理解することが重要です。数百メガバイトのドキュメントをマーシャリング/アンマーシャリングする場合、時間が重要です-JiBXは優れた代替手段です。JAXB ==リフレクション、JiBX ==バイトコード計測。
codefinger 2009


19

私はいつもJAXBを仕事で使用しており、本当に気に入っています。常に変化する複雑なXMLスキーマに最適であり、XMLファイル内のタグのランダムアクセスに特に適しています。

私はヒモが嫌いですが、私はブログを始めたばかりで、これは文字通り最初に投稿したものです!

ここでそれをチェックしてください:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/


4
ブログの明確な例。そのために賛成。:-)
ショーンD.

9

JAXBを使用すると、オブジェクトのXML表現(マーシャリング)とXMLのオブジェクト表現(アンマーシャリング)を自動的に作成できます。

XMLスキーマに関する限り、2つの選択肢があります。

  • XSDからJavaクラスを生成する
  • JavaクラスからXSDを生成する

XStreamDigesterXMLBeansなど、よりシンプルなXMLシリアライゼーションライブラリもいくつかあります。


1
これらはバインディングフレームワークではなく、シリアル化ライブラリです。優れたバインディングフレームワークは、XMLを同形オブジェクトグラフにマッピングしたり、再度マップしたりできます。これらの単純なシリアル化メカニズムは、固定された非標準のXMLスキーマを生成および消費します。
エリクソン

エリクソンに感謝します。私はJAXBのみを使用してきたので、代替案について言及したいと思いました。入力内容に基づいて回答を編集します。
Fabian Steeg

実際、XStreamは問題ありませんが、どちらも非常に単純なので、それほど単純ではありません。そして、ダイジェスターは単純ではなく、単純化されています。
StaxMan 2009年

2
誰かがアノテーションを使用してJAXB-2.0について言及してください。そのいくつかのXmlAdapterクラスの間で、任意のスキーマを既存のJava構造にマップできます。
Mark Renouf、

8

JAXBは、XMLスキーマとして定義された外部XML仕様(xsd)にコーディングする必要がある場合に最適です。

たとえば、取引アプリケーションを持っている、あなたはに取引を報告しなければならないユーバーラメ展覧会のレポートアプリケーションと、彼らはあなたを与えてくれたultra.xsdと乗ることを。$JAVA_HOME/bin/xjcコンパイラーを使用して、XMLを一連のJavaクラス(例:)に変換しますUltraTrade

次に、単純なアダプターレイヤーを作成して、取引オブジェクトをに変換し、UltraTradesそれを使用しJAXBてデータをUltra-Corpにマーシャリングします。取引をXML形式に変換することよりもはるかに簡単です。

それがすべて失敗するのは、Ultra-Corpが実際に独自の仕様に従わなかったときであり、price彼らがダウンしている取引xsd:floatは実際にはdouble


1
また、最初にコードを実行できることにも注意してください。Beanから始めて、必要なスキーマを生成します。
StaxMan 2009年

7

なぜJAXBが必要なのですか? Webサービスのリモートコンポーネント(Javaで記述)は、XMLを使用して相互にメッセージを交換します。なぜXMLなのか?なぜなら、XMLはリソースが限られたネットワーク上でメッセージを交換するための軽量オプションと見なされているからです。そのため、多くの場合、これらのXMLドキュメントをオブジェクトに、またはその逆に変換する必要があります。例:単純なJava POJO従業員を使用して、従業員データをリモートコンポーネント(Javaプログラム)に送信できます。

class Employee{
 String name;
 String dept;
 ....
}

このPojoは、次のようにXMLドキュメントに変換(マーシャル)する必要があります。

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>

そして、リモートコンポーネントで、XMLドキュメントからJavaオブジェクトに戻ります(Un-Marshall)。

JAXBとは

JAXBは、マーシャリングおよびアンマーシャリングのこの操作を実行するためのライブラリまたはツールです。それだけで、この頭痛の種からあなたを救います。


4

JIBXも確認できます。また、非常に優れたXMLデータバインダーでもあり、OTA(Open Travel Alliance)にも特化しており、AXIS2サーバーでサポートされています。あなたがパフォーマンスと互換性を探しているなら、あなたはそれをチェックすることができます:

http://jibx.sourceforge.net/index.html


0

JAXBは、デフォルトのマーシャリング最適化によりパフォーマンスを向上させます。JAXBは、XMLドキュメントとの間でJavaオブジェクトを読み書きするためのプログラマAPIを定義し、Javaを介したXMLの読み書きを簡素化します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.