我想直接从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);
}
}
请注意,这些类都没有无参数构造函数。
一个序列化的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没有一个无参数构造函数,即使我在那里放了一个,因为它不能被实例化。
但是,即使我使Field类非抽象,通过默认构造函数分配给这两个字段(name, value)的值也是主要的值,而不是从XML字符串反序列化的实际值。即使工作,我不会得到一个子对象(StringField),而是一个父对象(Field)。
是否有任何通用的方法来动态反序列化pojo,而不需要模式声明,并使用JAXB获得实际的(子)对象?
您需要注释您的字段
https://jaxb.java.net/2.2.6/docs/ch03.html annotating-your-classes
使用类似:@XmlElement和@XmlAttribute
这是一个很好的教程:
http://www.vogella.com/articles/JAXB/article.html希望对你有帮助。