XStream разные псевдонимы для одного и того же класса (Map.class) для разных полей - PullRequest
1 голос
/ 26 июля 2011

Я использую XStream для преобразования класса Java, который имеет поля типа java.util.Map.У меня есть конвертер для java.util.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>

Вместо появления тегов карты, я хотел бы использовать другие теги, основанные на имени поля в классе.Например, в списке «Платежи» будет указано имя тега оплаты, а в списке «Предметы» будет элемент имени тега для каждого элемента карты.

Как динамически установить псевдоним на основе поля в том же классе?1007 * -Anand

1 Ответ

1 голос
/ 02 августа 2012

Я использовал 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));
...