如何解决基本类型的显式 XML 序列化
使用 Jackson 序列化一个简单的类型层次结构:
static class Base {
@JsonProperty
private final int foo = 42;
}
static class Derived extends Base {
@JsonProperty
private final int bar = 39;
}
使用 Jackson XmlMapper 我得到以下输出:
<Derived>
<foo>42</foo>
<bar>39</bar>
</Derived>
我真正想要的是包含基本类型的 XML:
<Derived>
<Base>
<foo>42</foo>
</Base>
<bar>39</bar>
</Derived>
我浏览了 Jackson API,尤其是类型注释和 SerializationFeature
,但不知道如何实现这一点。
有什么想法吗?
我正在寻找一种通用方法,因为我正在处理深度嵌套层次结构中的数百个类。
更新
至少我知道如何使用 XStream 做到这一点:
public class TypeHierarchyConverter implements Converter {
@Override
public boolean canConvert(@SuppressWarnings("rawtypes") final Class clazz) {
return Base.class.isAssignableFrom(clazz);
}
@Override
public void marshal(final Object value,final HierarchicalStreamWriter writer,final MarshallingContext context) {
try {
enumerateFields(value,writer,context);
} catch (final illegalaccessexception e) {
e.printstacktrace();
}
}
@Override
public Object unmarshal(final HierarchicalStreamReader reader,final UnmarshallingContext context) {
return null;
}
private void enumerateFields(final Object value,final MarshallingContext context) throws illegalaccessexception {
enumerateFields(value,context,value.getClass(),false);
}
private void enumerateFields(final Object value,final MarshallingContext context,final Class<?> c,final boolean nest) throws illegalaccessexception {
final String name = c.getSimpleName();
if (nest) {
writer.startNode(name);
}
final Class<?> superclass = c.getSuperclass();
if (!Object.class.equals(superclass)) {
enumerateFields(value,superclass,true);
}
final Field[] fields = c.getDeclaredFields();
for (final Field f : fields) {
f.setAccessible(true);
writer.startNode(f.getName());
context.convertAnother(f.get(value));
writer.endNode();
f.setAccessible(false);
}
if (nest) {
writer.endNode();
}
}
}
仍然不知道和杰克逊一起做这件事很热。 :(
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。