我想直接从XML字符串中反序列化(解组)POJO,而不需要任何配置(模式定义或其他)文件。动态JAXB 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);
}
}
注意,没有无参数构造上任何这些类。
中的序列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没有无参数构造函数,即使我在那里放置一个,因为它不能被实例化。
但即使我将Field类设置为非抽象,通过默认构造函数分配给2个字段(name,value)的值是主要的值,而不是从XML字符串反序列化的实际值。即使这有效,我不会得到一个子对象(StringField),但是一个父对象(Field)。
是否有任何动态反序列化POJO,没有模式声明,并获得实际(子)对象使用JAXB的通用方式?