Десериализация XStream при изменении типа переменной - PullRequest
1 голос
/ 19 января 2011

У меня есть класс Java, который выглядит как

public class MyClass {
   private final String str;
   private Polygon polygon; // this polygon is a custom type of mine
}

У меня есть xml-файл, в который записан экземпляр MyClass с использованием XStream.

Теперь MyClass изменилось и полигон был заменен на List<Polygon>, а поле было переименовано в polygons, и я стараюсь не нарушать десериализацию. Я хочу изменить десериализацию поля polygon, чтобы в основном прочитать многоугольник, а затем просто создать новый список и добавить к нему один многоугольник. Список будет тогда новым значением поля.

Можно ли изменить преобразование только этого одного поля? Или мне нужно написать собственный конвертер для всего класса MyClass?

спасибо, Джефф

1 Ответ

1 голос
/ 03 февраля 2011

Итак, основываясь на вашем комментарии, я считаю, что вам понадобится пользовательский конвертер.

Вот пример:

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 MyClassConverter implements Converter{

    @Override
    public boolean canConvert(Class clazz) 
    {
        return clazz.equals(MyClass.class);
    }

    @Override
    public void marshal(Object value, HierarchicalStreamWriter writer,
            MarshallingContext context) 
    {

    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader,
            UnmarshallingContext context) 
    {
        // Create MyClass Object
        MyClass myClass = new MyClass();

        // Traverse Tree
        while (reader.hasMoreChildren()) 
        {
            reader.moveDown();
            if ("polygon".equals(reader.getNodeName())) 
            {
                Polygon polygon = (Polygon)context.convertAnother(myClass, Polygon.class);
                myClass.addPolygon(polygon);
            } 
            reader.moveUp();
        }

        // Return MyClass Object
        return myClass;
    }
}

Если вы не знаете, вот справочное руководство:http://x -stream.github.io / converter-tutorial.html

Теперь осталось только зарегистрировать свой конвертер, что, я полагаю, вы знаете, как это сделать.В любом случае, важная, хотя и очевидная вещь, которую стоит отметить, это то, что addPolygon - это метод, который я использовал для заполнения вашего нового объекта списка.

...