微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基本类型的显式 XML 序列化

如何解决基本类型的显式 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 举报,一经查实,本站将立刻删除。