【问题标题】:XStream different alias for same class (Map.class) for different fieldsXStream 不同字段的同一类(Map.class)的不同别名
【发布时间】:2011-10-13 02:34:50
【问题描述】:

我正在使用 XStream 转换具有 java.util.Map 类型字段的 Java 类。我有一个 java.util.Map 转换器,它将 Map 的键显示为 xml 元素,将地图的值显示为 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>

我想根据类中的字段名称使用不同的标签,而不是出现地图标签。例如,Payments 列表将具有标签名称 payment,而 Items 列表将具有每个 Map 元素的标签名称 item。

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

-阿南德

【问题讨论】:

    标签: xml-serialization xstream


    【解决方案1】:

    我使用XStream 创建原子提要报告。内容中的条目可以是不同的对象类,我想动态使用类名。这是我的解决方案。我创建了一个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));
    

    【讨论】:

    • 感谢 Yen 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2018-08-17
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多