Кастор и JAXB Marshaller

В настоящее время я использую структуру Castor для преобразования объекта в файл xml, он отлично работает.

Writer writer = new FileWriter("D:/out.xml");
Marshaller.marshal(test, writer);

Но теперь я использую javax.xml.bind, чтобы сделать то же самое.

            Writer writer = new FileWriter("D:/out.xml");
        JAXBContext context =
            JAXBContext.newInstance(test.getClass());
        Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(test, writer);

Затем я попадаю в это сообщение об ошибке:

невозможно маршалировать тип "package1.Testing" в качестве элемента, поскольку в нем отсутствует аннотация @XmlRootElement]


person user236501    schedule 12.01.2010    source источник


Ответы (1)


Добавьте XmlRootElement< /a>, и вы больше не получите ошибку. Это должно быть добавлено в класс верхнего уровня или «корневой».

person Taylor Leese    schedule 12.01.2010
comment
Спасибо за ваш ответ, можете ли вы примерно объяснить мне, почему использование castor нормально, но jaxb нужно добавить в XmlRootElement - person user236501; 12.01.2010
comment
Это просто семантика. Castor и JAXB API отличаются, и JAXB требует аннотации, а Castor — нет. - person Taylor Leese; 12.01.2010
comment
Означает ли это, что JAXB нужно знать, на какой класс смотреть, поэтому в моем файле тестирования я должен указать @XmlRootElement? - person user236501; 12.01.2010
comment
Тестовый класс — это ваш пример, который должен иметь @XmlRootElement. - person Taylor Leese; 12.01.2010
comment
Я знаю, что нужно добавить в @XmlRootElement, просто хочу знать причину, по которой нужно добавить. Спасибо за ваш ответ, я решил проблему. - person user236501; 12.01.2010
comment
Причина в том, что именно так JAXB определяет имя корневого элемента. Это необходимо только для корневого элемента, поскольку свойства используют имя поля/получателя/установщика для определения имени элемента; но это недоступно для root. Я предполагаю, что Castor по умолчанию использует имя класса или что-то еще, но JAXB требует явного определения. - person StaxMan; 08.02.2010