JAXB 2.x: Как демаршалировать XML, не зная целевой класс?

Если есть способ, как это сделать, я бы хотел знать самый элегантный. Вот вопрос: - Предположим, у вас есть абстрактный класс Z - У вас есть два класса, унаследованных от Z: с именами A и B.

Вы маршалируете любой экземпляр (A или B) следующим образом:

JAXBContext context = JAXBContext.newInstance(Z.class);
Marshaller m = context.createMarshaller();
m.marshal(jaxbObject, ...an outputstream...);

В полученном XML вы видите, какой это был экземпляр (A или B).

Теперь, как вы демаршалируете

JAXBContext jc = JAXBContext.newInstance(Z.class);
Unmarshaller u = jc.createUnmarshaller();
u.unmarshal(...an inputstream...)

Я получаю UnmarshalException с сообщением

 «Описание исключения: дескриптор с корневым элементом по умолчанию {} <корневой тег, например A или B> не найден в проекте]

javax.xml.bind.UnmarshalException "

Итак, как сделать демаршаллинг, чтобы получить экземпляр Z, а затем вы можете протестировать ПОСЛЕ демаршаллинга, что это такое? Например, z instanceof A, затем ... z instanceof B, тогда что-нибудь еще ... и т. Д.

Спасибо за любые идеи или решения.

Я использую JRE1.6 с MOXy как JAXB Impl.

7
задан Matt Ball 2 May 2011 в 23:21
поделиться