Я хочу десериализовать (демаршировать) простые POJO непосредственно из XML-строки, без какого-либо файла конфигурации (определения схемы или другого).
Мое приложение использует простой базовый абстрактный класс Field
следующим образом:
public abstract class Field
{
private final String name;
private final Object value;
protected Field(String name, Object value)
{
this.name = name;
this.value = value;
}
}
, который расширяется различными другими классами, такими как
public class StringField extends Field
{
public StringField(String name, String value)
{
super(name, value);
}
}
Обратите внимание, что ни в одном из этих классов нет конструктора без аргументов.
A сериализованныйStringField POJO будет выглядеть примерно так:
<StringField>
<name>test</name><type />
<value>Some text</value>
</StringField>
Предполагая, что приведенный выше XML хранится в строковой переменной с именем xml
, я пытаюсь использовать JAXB для десериализации, используя следующий метод:
public static Field deserialize(String xml)
{
Field field = null;
try
{
JAXBContext context = JAXBContext.newInstance(Field.class);
javax.xml.bind.Unmarshaller um = context.createUnmarshaller();
field = (Field)um.unmarshal(new StringReader(xml));
}
catch (JAXBException e)
{
e.printStackTrace();
}
return field;
}
В идеале, я бы хотел десериализовать строку XML в соответствующий Java POJO (т. Е. StringField в приведенном выше случае).
Однако я получаю исключения JAXB, поскольку у Field нет no-arg конструктор и, даже если я добавлю его туда, потому что его нельзя создать.
Но даже если я сделаю класс Field неабстрактным, значения присваиваются через tКонструктор по умолчанию для двух полей (имя, значение) является преобладающим, в отличие от фактических значений, десериализованных из строки XML.Даже если бы это сработало, я бы не получил дочерний объект (StringField), но родительский (Field).
Существует ли какой-либо общий способ динамической десериализации POJO без объявления схемы и получения реальных (дочерних) объектов с использованием JAXB?