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

时间:2011-11-18 03:26:21

标签: xml jaxb deserialization

我想直接从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获取实际(子)对象的通用方法?

1 个答案:

答案 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

希望有所帮助。