xstream - повторное использование конвертера по умолчанию в пользовательском конвертере - PullRequest
6 голосов
/ 24 мая 2011

Я использую xstream для обработки строки XML, но некоторые поля объекта изменились между версиями, поэтому я реализую пользовательский конвертер. Сводка изменений полей приведена ниже, и только первые два типа полей отличаются.

Field    type1      type2
a        short      String
b        String     Object
c        List       List
d        Object     Object
.
.
.
x        String     String

Мой преобразователь тока реализован специально для обработки каждого из полей, что приводит к большому количеству условий else в методе unmarshal ()

package a.b.c.reports;

import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

public class MyConverter implements Converter {

..

@Override
public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {

    while (reader.hasMoreChildren()) {
        reader.moveDown();
        if(reader.getNodeName().equals("a"))
        {
            a = reader.getValue();
        }
        else if (reader.getNodeName().equals("b")) 
        {
            b = (Object) context.convertAnother(reader, Object.class);
        } 
        else if(reader.getNodeName().equals("c"))
        {
            a = reader.getValue();
        }
        ..
        ..
    }
}

Есть ли более разумный способ делегировать обработку полей, типы которых не изменились на конвертер xstream по умолчанию?

1 Ответ

3 голосов
/ 16 октября 2015

Вопрос немного устарел, но тем не менее мне потребовалось некоторое время, чтобы собрать биты.

Простое решение - расширить ReflectionConverter вместо реализации интерфейса Converter.ReflectionConverter является конвертером по умолчанию в XStream, поэтому переопределите то, что нужно, и super все остальное.Тогда new XStream().register твой новый конвертер, и ты в порядке.

...