我想直接从XML字符串反序列化(解组)简单的POJO,而不需要任何配置(模式定义或其他)文件。
我的应用程序使用简单的基本抽象类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);
}
}
请注意,这些类中没有no-arg构造函数。
序列化的StringField POJO看起来像
<StringField>
<name>test</name><type />
<value>Some text</value>
</StringField>
假设上面的XML存储在名为xml
的String变量中,我试图通过以下方法使用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类非抽象,通过默认构造函数分配给2个字段(name,value)的值也是主流,而不是从XML字符串反序列化的实际值。即使这样有效,我也不会得到子对象(StringField)而是父对象(Field)。
是否存在动态反序列化POJO,没有模式声明以及使用JAXB获取实际(子)对象的通用方法?
答案 0 :(得分:3)
您需要为字段添加注释
https://jaxb.java.net/2.2.6/docs/ch03.html#annotating-your-classes
使用类似:@XmlElement和@XmlAttribute
这是一个很好的教程:
http://www.vogella.com/articles/JAXB/article.html
希望有所帮助。