动态JAXB XML反序列化(反编组)



我想直接从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

希望对你有帮助。

最新更新