Что такое 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 - это просто фантастика. В моем проекте я преобразовывал большие объемы данных между двоичным (который использовался программой C) и XML (чтобы люди могли потреблять и изменять эти данные). Полученная в результате XML-схема была нетривиальной (много уровней иерархии, некоторые поля могли повторяться, другие - нет), поэтому JAXB был полезен, поскольку имел возможность манипулировать этим.

poundifdef
источник
21
JAXB можно реализовать без XSD. Вы можете использовать аннотации: jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger
7
JAXB - это спецификация (например, JPA или JAXP), что означает, что существует несколько реализаций (Metro, EclipseLink и т. Д.). Если у вас есть проблема с одним, вы можете переключиться на другую реализацию. Вы также можете воспользоваться расширениями, предлагаемыми разными поставщиками.
bdoughan
@BlaiseDoughan, Metro - это реализация JAXB ?! Разве Metro не является реализацией WSIT?
Мухаммад Гелбана
1
@MuhammadGelbana - думаю, мне следовало бы называть его Project JAXB ( jaxb.java.net ), который является частью реализации Metro JAX-WS ( metro.java.net ).
bdoughan
2
К вашему сведению, JAXB удаляется из Java SE 11. См. JEP 320: Удаление модулей Java EE и CORBA . Это действие предпринимается в рамках модуляризации Java SE и передачи технологий Java EE проекту Jakarta EE . Вам нужно будет добавить JAXB API и реализацию в свой проект.
Basil Bourque
23

Вот причина не использовать его: страдает производительность. При маршалинге и демаршалинге возникает много накладных расходов. Вы также можете рассмотреть другой API для привязки XML-объекта, например JiBX: http://jibx.sourceforge.net/

кодовый палец
источник
1
Также рассмотрите возможность использования инструмента XSD2Jibx, если у вас возникли проблемы с привязками - он находится в статусе «альфа», но он действительно полезен для иллюстрации классов и привязок, которые ему нравятся, с помощью схем XSD ... теперь, если только он перестал использовать дату SQL по умолчанию , и вместо этого использовал Java util Date ...
MetroidFan2002 04
3
Чушь собачья. JAXB работает довольно быстро, если вы используете быстрый парсер (например, Woodstox), накладные расходы могут составлять 30-40% по сравнению с ручным связыванием. JiBX в порядке, проблем с ним нет, но разница в производительности не велика.
StaxMan,
6
Я использовал JAXB в нескольких проектах и ​​продолжаю его использовать. Но важно понимать, как он сравнивается с другими фреймворками. Если вы маршалируете / демаршалируете документы размером в сотни мегабайт, и время важно - JiBX - хорошая альтернатива. JAXB == отражение, JiBX == инструментарий байтового кода.
codefinger
19

Это «ORM для XML». Чаще всего используется вместе с JAX-WS (и действительно, реализации Sun разрабатываются вместе) для систем WS Death Star.

Том Хотин - tackline
источник
19

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

Я ненавижу сутенерство, но я только что завел блог, и это буквально первое, о чем я писал!

Посмотрите здесь:

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

артгон
источник
4
Наглядный пример в вашем блоге. Проголосовали за это. :-)
Shawn D.
9

С помощью JAXB вы можете автоматически создавать XML-представления ваших объектов (маршалинг) и объектные представления XML (немаршалинг).

Что касается схемы XML, у вас есть два варианта:

  • Создание классов Java из XSD
  • Создайте XSD из ваших классов Java

Существуют также несколько более простых библиотек сериализации XML, таких как XStream , Digester или XMLBeans, которые могут быть альтернативой.

Фабиан Штег
источник
1
Это не связывающие фреймворки, это библиотеки сериализации. Хорошая структура связывания может отображать любой XML в граф изоморфных объектов или обратно. Эти простые механизмы сериализации создают и используют фиксированную нестандартную схему XML.
erickson 03
Спасибо, Эриксон, я работал только с JAXB и хотел убедиться, что упомянул альтернативы. Я отредактирую свой ответ на основе вашего ввода.
Fabian Steeg,
На самом деле, хотя с XStream все в порядке, это не так просто, поскольку оба они очень просты. И Digester НЕ прост, а просто упрощен.
StaxMan,
2
Кто-нибудь, пожалуйста, укажите JAXB-2.0, используя аннотации. Между этим и несколькими классами XmlAdapter я могу сопоставить любую схему с любой существующей структурой Java.
Марк Ренуф,
8

JAXB отлично подходит, если вам нужно кодировать некоторую внешнюю спецификацию XML, определенную как XML schema ( xsd).

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

Затем вы можете просто написать простой слой адаптера для преобразования ваших торговых объектов UltraTradesи использовать его JAXBдля распределения данных в Ultra-Corp. Намного проще, чем возиться с преобразованием ваших сделок в их формат XML.

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

Oxbow_lakes
источник
1
Также обратите внимание, что вы МОЖЕТЕ делать сначала код: начните с beans, сгенерируйте схему, если вам это нужно.
StaxMan,
7

Зачем нам нужен JAXB? Удаленные компоненты (написанные на Java) веб-служб используют XML как средство обмена сообщениями между собой. Почему XML? Поскольку XML считается легковесным вариантом обмена сообщениями в сетях с ограниченными ресурсами. Очень часто нам нужно преобразовать эти XML-документы в объекты и наоборот. Например: Simple Java POJO Employee может использоваться для отправки данных Employee удаленному компоненту (также программе Java).

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

Это Pojo должно быть преобразовано (Маршалл) в документ XML следующим образом:

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

А в удаленном компоненте - обратно к объекту Java из XML-документа (Un-Marshall).

Что такое JAXB?

JAXB - это библиотека или инструмент для выполнения этой операции маршалинга и демаршалинга. Это очень просто избавляет вас от этой головной боли.

Прашант_М
источник
4

Вы также можете попробовать JIBX. Это также очень хороший связыватель XML-данных, который также специализируется на OTA (Open Travel Alliance) и поддерживается серверами AXIS2. Если вам нужна производительность и совместимость, вы можете это проверить:

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

Потерянный
источник
0

JAXB обеспечивает повышенную производительность за счет оптимизации маршалинга по умолчанию. JAXB определяет программный API для чтения и записи объектов Java в документы XML и из них, что упрощает чтение и запись XML через Java.


источник