gpt4 book ai didi

xml - 动态 JAXB XML 反序列化(解码)

转载 作者:行者123 更新时间:2023-12-04 06:07:31 32 4
gpt4 key购买 nike

我想直接从 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 类成为非抽象类,通过默认构造函数分配给 2 个字段(名称、值)的值也是普遍存在的,而不是从 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

希望有帮助。

关于xml - 动态 JAXB XML 反序列化(解码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8177377/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com