Лучшая практика: сериализация Java / XML: как определить, к какому классу десериализоваться? - PullRequest
0 голосов
/ 18 октября 2011

У меня есть приложение, которое сохраняет свой контекст в XML. В этом приложении есть иерархия классов, которые реализуют общий интерфейс и представляют разные настройки. Например, первый установочный класс может быть сделан из 4 открытых полей с плавающей точкой, другой может быть сделан из единственного HashMap.

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

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

Я подумал, что мог бы написать имя .class в атрибуте XML, прочитать его и сравнить со всеми возможными именами классов .class, пока не найду совпадение. Есть ли более разумный способ?

Спасибо

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

xstream уже должен позаботиться об этом и создать объект правильного типа.

Учебное пособие , кажется, подтверждает, что:

Чтобы восстановить объект, чисто из XML:

Person newJoe = (Person)xstream.fromXML(xml);

Если вы не знаете тип, вам придется сначала назначить его общему типу интерфейса:

CommonInterface newObject = (CommonInterface)xstream.fromXML(xml);
// now you can either check its type or call virtual methods
1 голос
/ 18 октября 2011

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

0 голосов
/ 19 октября 2011

Лучшей практикой будет использование установленного, хорошо документированного синтаксического анализатора / преобразователя XML. Вся работа по сериализации / десериализации выполнена, поэтому вы можете вместо этого беспокоиться о своей бизнес-логике. Castor и Apache Axiom - это два API, которые я использовал для маршалирования / демаршализации (сериализации / десериализации) Java-классов и XML.
http://www.castor.org

Аксиома Апача

...