2011-01-19 2 views
1

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

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

У меня есть файл XML, который имеет экземпляр MyClass написанный к нему с помощью XStream.

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

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

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

ответ

1

Так на основе комментарий, я полагаю, вы будете нуждаться в пользовательский конвертер.

Вот пример:

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» - это метод, который я использовал для заполнения вашего нового объекта списка.

+0

К сожалению, файлы xml хранятся на клиентских компьютерах, поэтому я не могу получить доступ ко всем файлам, и я не могу попросить их вручную их отредактировать. –

+2

«Как XStream справляется с новыми версиями классов?»: Http://xstream.codehaus.org/faq.html – mre