Що таке JAXB і навіщо я його використовую? [зачинено]


109

Тут хлопець клянеться, що JAXB - це найбільша річ з часу нарізаного хліба. Мені цікаво побачити, що користувачі Stack Overflow вважають, що випадок використання призначений для JAXB, і що робить це гарним чи поганим рішенням для цього випадку.


2
Прочитайте цю статтю (архітектура Java для прив'язки XML (JAXB)), це найкращий варіант. URL: oracle.com/technetwork/articles/javase/index-140168.html#unmars

Відповіді:


99

Я великий фанат JAXB за маніпулювання XML. В основному, це забезпечує вирішення цієї проблеми (я припускаю, що знайомий з XML, структурами даних Java та XML-схемами):

Робота з XML складна. Потрібен спосіб взяти XML-файл - це в основному текстовий файл - і перетворити його в якусь структуру даних, якою ваша програма може потім маніпулювати.

JAXB візьме XML-схему, яку ви пишете, і створить набір класів, що відповідають цій схемі. Утиліти JAXB створять ієрархію структур даних для маніпулювання цим XML.

Потім JAXB можна використовувати для читання XML-файлу, а потім створювати екземпляри згенерованих класів, завантажених даними з вашого XML. JAXB також робить зворотний: приймає класи java та генерує відповідний XML.

Мені подобається JAXB, тому що він простий у використанні та постачається з Java 1.6 (якщо ви використовуєте 1.5, ви можете завантажити JAXB .jars.) Те, як він створює ієрархію класів, інтуїтивно зрозумілий, і, на мій досвід, робить гідну роботу абстрагування "XML", щоб я міг зосередитись на "даних".

Отже, щоб відповісти на ваше запитання: я б очікував, що для невеликих XML-файлів JAXB може бути надмірним. Він вимагає від вас створити та підтримувати схему XML та використовувати "стандартні методи підручника" використання класів Java для структур даних. (Основні класи, невеликі внутрішні класи для представлення "вузлів" та величезна їх ієрархія.) Отже, JAXB, мабуть, не дуже підходить для простого лінійного списку "уподобань" для програми.

Але якщо у вас досить складна схема XML і багато даних, що містяться в ній, то JAXB є фантастичним. У своєму проекті я перетворював великі обсяги даних між бінарними (які споживалися програмою С) та XML (щоб люди могли споживати та змінювати ці дані). Отримана схема XML була нетривіальною (багато рівнів ієрархії, деякі поля могли повторюватися, а інші не могли), тому JAXB був корисним у тому, щоб маніпулювати цим.


21
JAXB можна зробити без XSD. Ви можете використовувати примітки: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger

7
JAXB - це специфікація (наприклад, JPA або JAXP), це означає, що існує кілька реалізацій (Metro, EclipseLink тощо). Якщо у вас є проблема з одним, ви можете перейти на іншу реалізацію. Ви також можете скористатися розширеннями, пропонованими різними постачальниками.
bdoughan

@BlaiseDoughan, Метро - це реалізація JAXB ?! Хіба Metro не є реалізацією WSIT?
Мухаммед Гелбана

1
@MuhammadGelbana - я думаю, я повинен називати це проектом JAXB ( jaxb.java.net ), який є частиною реалізації Metro JAX-WS ( metro.java.net ).
bdoughan

2
FYI, JAXB видаляється з Java SE 11. Див. JEP 320: Видалення модулів Java EE та CORBA . Ця дія робляться в рамках модулярізаціі Java SE , і передачі Java EE технологій в Джакарті ЕЕ проекту. Вам потрібно буде додати JAXB API та реалізацію до свого проекту.
Василь Бурк

23

Ось причина не використовувати його: продуктивність страждає. Існує велика кількість накладних витрат при маршируванні та знешкодженні. Ви також можете розглянути ще один API для прив'язки XML-об’єктів - наприклад, JiBX: http://jibx.sourceforge.net/


1
Також розгляньте можливість використання інструмента XSD2Jibx, якщо у вас виникли проблеми з прив’язками - він знаходиться в статусі "альфа", але це дійсно корисно проілюструвати класи та прив'язки, які йому подобаються за допомогою XSD-схем ... тепер, якщо тільки він припинив використання дати SQL за замовчуванням , а замість цього використовується Java util Date ...
MetroidFan2002,

3
Дурень. JAXB досить швидкий, якщо ви використовуєте швидкий аналізатор (наприклад, Woodstox), накладні витрати на 30-40% порівняно з ручним прив’язкою. JiBX чудово, з цим проблем немає, але різниця в продуктивності не величезна.
StaxMan

6
Я використовував JAXB у кількох проектах і продовжую його використовувати. Але важливо зрозуміти, як вона порівнюється з іншими рамками. Якщо ви перебуваєте в маршалінгу / відміні документів, що мають сотні мегабайт, і час важливий - JiBX - хороша альтернатива. JAXB == відображення, JiBX == приладовий код байтового коду.
codefinger

19

Це "ORM для XML". Найчастіше використовується поряд з JAX-WS (і справді реалізація Sun розробляється разом) для систем WS Death Star.


19

Я використовую JAXB на роботі весь час, і мені дуже подобається. Він ідеально підходить для складних XML-схем, які завжди змінюються і особливо хороші для випадкового доступу тегів у XML-файл.

Я ненавиджу сутенера, але я тільки почав блог, і це буквально перше, що я опублікував про!

Перевірте це тут:

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


4
Ясний приклад у вашому блозі. За це прихильне. :-)
Шон Д.

9

За допомогою JAXB ви можете автоматично створювати представлення XML ваших об'єктів (маршалінг) та об'єктних представлень XML (демарширування).

Що стосується схеми XML, у вас є два варіанти:

  • Створення Java-класів з XSD
  • Створіть XSD з класів Java

Є також простіші бібліотеки серіалізації XML, такі як XStream , Digester або XMLBeans, які можуть бути альтернативними.


1
Це не обов'язкові рамки, це бібліотеки серіалізації. Хороша рамка зв'язування може відображати будь-який XML на ізоморфному об’єктному графіку або назад. Ці прості механізми серіалізації створюють та споживають фіксовану, нестандартну схему XML.
erickson

Завдяки erickson, я працював лише з JAXB і хотів переконатися, що я згадую альтернативи. Я відредагую свою відповідь на основі ваших даних.
Фабіан Стіг

Насправді, хоча з XStream все в порядку, це не дуже просто, оскільки обидва дуже прості. І Digester НЕ простий, а просто спрощений.
StaxMan

2
Хтось, будь ласка, згадає JAXB-2.0, використовуючи Анотації. Між цим декількома класами XmlAdapter я можу зіставити будь-яку схему в будь-яку існуючу структуру Java.
Марк Ренуф

8

JAXB чудово, якщо вам доведеться кодувати якийсь зовнішній специфікат XML, визначений як XML-схема ( xsd).

Наприклад, у вас є торгова заявка, і ви повинні повідомити про торги додатку Uber Lame Trade Reporting App, і вони дали вам ultra.xsdможливість продовжувати роботу. Використовуйте $JAVA_HOME/bin/xjcкомпілятор, щоб перетворити XML у купу класів Java (наприклад UltraTrade).

Тоді ви можете просто написати простий адаптерний шар, щоб конвертувати ваші торгові об’єкти UltraTradesі використовувати JAXBдля перенесення даних на Ultra-Corp. Набагато простіше, ніж возитися з конвертацією ваших торгів у їх XML-формат.

Де все виходить з ладу, коли Ultra-Corp насправді не підкоряються власним специфікаціям, а торгівля, priceяку вони знижують, як xsd:floatнасправді, повинна виражатися як double!


1
Також зауважте, що ви МОЖЕТЕ зробити код першим: почніть з бобів, генеруйте схему, якщо вона вам потрібна.
StaxMan

7

Навіщо нам потрібен JAXB? Віддалені компоненти (написані на Java) веб-сервісів використовують XML як засіб обміну повідомленнями між собою. Чому XML? Оскільки XML вважається легким варіантом для обміну повідомленнями в Мережах з обмеженими ресурсами. Тому часто нам потрібно перетворити ці XML-документи в об'єкти і навпаки. Напр .: Простий Java POJO Співробітник може використовуватися для надсилання даних працівника до віддаленого компонента (також програми Java).

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

Це Pojo слід перетворити (Marshall) в XML-документ таким чином:

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

А на віддаленому компоненті поверніться до об’єкта Java з документа XML (Un-Marshall).

Що таке JAXB?

JAXB - це бібліотека або інструмент для виконання цієї операції Marshalling і UnMarshalling. Це позбавить вас від цього головного болю, такого простого.


4

Ви також можете перевірити JIBX. Це також дуже гарне сполучення даних у форматі XML, яке також спеціалізується на OTA (Open Travel Alliance) та підтримується серверами AXIS2. Якщо ви шукаєте продуктивність та сумісність, ви можете перевірити це:

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


0

JAXB забезпечує покращену продуктивність завдяки оптимізаціям за замовчуванням. JAXB визначає API програміста для читання та запису Java-об'єктів до та з XML-документів, тим самим спрощуючи читання та запис XML через Java.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.