В чем разница между привязкой Castor XML и привязкой JAXB - PullRequest
10 голосов
/ 11 января 2010

В чем разница между привязкой Castor XML и JAXB, поскольку обе привязывают объект java к XML и наоборот.

Обновлено:

Как и при использовании Castor, я могу сделать это. Предположим, что packageA.ClassA и packageB.ClassA имеют одинаковые атрибуты и имя класса только для того, чтобы находиться в другом пакете.

packageA.ClassA - > XML -> packageB.ClassA 

Используя JAXB, если я делаю этот объект Маршалла packageA.ClassA в XML и из немаршалла XML в объект packageB.ClassA Я получил ошибку Casting.

Ответы [ 2 ]

16 голосов
/ 11 января 2010

Обратите внимание, что JAXB - это API, и доступно несколько реализаций.

Sun предоставляет эталонную реализацию и упаковывает ее в J2EE (она также доступна в J2SE 1.6). Кастор родился до того, как JAXB вышел из Sun, и предлагает некоторые дополнительные функции. Но если все, что вам нужно, это простая привязка XML, то эталонная реализация Sun должна работать отлично.

В JavaWorld есть отличная статья . Немного стар, но большинство идей, объясненных там, все еще остается в силе. И вы не найдете статью, в которой упоминаются аннотации JAXB, которые в наше время упростили ситуацию.

Простой - это простой в использовании механизм связывания, который работает с минимальной «простой» конфигурацией.

DOM - принципиально иное понятие - оно все о синтаксическом анализе и ничего не делает с привязкой. Используя анализатор DOM, вы можете извлекать данные из XML. Но это не дает вам возможности отображения объектов. Таким образом, вам все равно придется извлекать данные с помощью DOM, а затем писать код, чтобы передать эти данные в Java-объект.

3 голосов
/ 08 июня 2010

Вы получаете исключение приведения класса, потому что данный экземпляр JAXBContext связывает каждое имя корневого элемента XML с одним классом привязки.

Таким образом, когда вы маршалируете packageA.ClassA в XML, а затем снова демаршируете его, результатом будет packageA.ClassA, и вы не сможете его разыграть.

Если вы хотите разархивировать до packageB.ClassA, то вам нужно построить вторую JAXBContext. Первый JAXBContext знает о packageA.ClassA, второй знает о packageB.ClassA. Первый используется для маршалинга в XML, второй - для демаршаллинга. Это будет работать, как вы ожидаете.

...