Может ли JAXB хранить имя класса в XML, чтобы код десериализации не нуждался в знании класса? - PullRequest
1 голос
/ 30 декабря 2010

Кажется, что стандартный подход для десериализации JAXB XML заключается в указании имени пакета при создании контекста. Затем JAXB ищет класс на основе корневого элемента:

JAXBContext jc = JAXBContext.newInstance("com.foo");
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal(new StringReader("<?xml version="1.0" encoding="UTF-8"     standalone="yes"?><MyJaxb>..."));

Я ищу более гибкий подход, при котором мне не нужно указывать имя пакета и все равно можно десериализовать любой объект. Это было бы так же просто, как JAXB, хранящий пакет в XML, но я не могу понять, как это сделать. Я могу написать код, чтобы сделать это сам, но это было бы неприятно. Он хотел бы, чтобы JAXB сделал это, если это возможно. Кстати, я не использую схемы, просто аннотации и маршал / демаршал. Есть идеи?

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

На самом деле вы не можете десериализовать «любой» объект с помощью чистого JAXB. Вы должны указать либо пакеты (где будет запрашиваться ObjectFactory.class), либо список классов, таких как JAXBContext.newInstance(Class1.class, Class2.class, Class3.class); Вот как работает jaxb, это часть соглашения. Если ваши задачи шире, то это, например, Создание классов Java из произвольной структуры данных XML - это также возможно, но вам нужно быть немного более конкретным - что вы имеете в виду под «более гибким подходом».

1 голос
/ 30 декабря 2010

Вы должны иметь возможность добавить более одного пакета, когда получите экземпляр объекта jaxbcontext. Вы можете добавить столько пакетов, сколько хотите, как показано ниже.

JAXBContext jc = JAXBContext.newInstance("com.foo.package1:com.foo.package2" ); 

однако, я не уверен, как вы собираетесь использовать его, если десериализуете его в экземпляр Object? Вы не собираетесь использовать то, что только что десериализовали?

Также Unmarshaller не является потокобезопасным классом, если ваше приложение является многопоточным.

...