XStream针对不同字段的相同类(Map.class)的不同别名

时间:2011-07-26 04:30:03

标签: xml-serialization xstream

我正在使用XStream转换具有java.util.Map类型字段的Java类。我有一个java.util.Map转换器,它将Map的键显示为xml元素,map的值显示为xml元素的值。我已经使用registerConverter方法注册了转换器。当我执行编组时,我得到以下输出。

<cart account_id="123" shift_id="456" account_postings_id="641">
  <supervisor_id>555</supervisor_id>
  <payments>
    <map sequence="1">
      <amount>123.45</amount>
      <billing_method>12345</billing_method>
      <form>card</form>
      <delivery_mode>Q</delivery_mode>
    </map>
    <map sequence="2">
      <amount>123.45</amount>
      <person_id>2333</person_id>
      <form>cash</form>
      <delivery_mode>Q</delivery_mode>
     </map>
  </payments>
  <items>
    <map sequence="3">
      <amount>1.00</amount>
      <type>pay_toll</type>
      <toll_id>1234</toll_id>
    </map>
  </items>
</cart>

我想要根据类中的字段名称使用不同的标记,而不是出现地图标记。例如,付款清单将标记名称付款,项目清单将为每个地图元素设置标记名称项。

我们如何根据同一类中的字段动态设置别名?

-Anand

1 个答案:

答案 0 :(得分:1)

我使用XStream创建了原子Feed报告。内容中的条目可以是不同的对象类,我想动态使用类名。这是我的解决方案。我创建了ObjectContentConverter并传递了XStream,然后使用xstream.aliasField() with getClass().getSimpleName()

private class ObjectContentConverter implements Converter {
    XStream xStream;

    private ObjectContentConverter(XStream xStream) {
        this.xStream = xStream;
    }

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        String className = WordUtils.uncapitalize(source.getClass().getSimpleName());
        xStream.aliasField(className, Content.class, "objectContent");
        xStream.marshal(source, writer);
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public boolean canConvert(Class type) {
        return true;  //To change body of implemented methods use File | Settings | File Templates.
    }
}

xStream.registerLocalConverter(Content.class, "objectContent", new ObjectContentConverter(xStream));