2015-12-11 3 views
0

Я нахожусь в команде, которой поручено написать новую версию программного пакета. В старой версии XStream использовался для сериализации. Для новой версии мы хотели бы реорганизовать модель данных, которая, в свою очередь, потребует нового формата для нашего выходного файла. Нам нужно поддерживать чтение старых форматов данных, и существует более одного старого формата.Насколько я могу изменить свою модель данных и использовать XStream/JAXB?

Например, в старой версии я мог бы иметь такую ​​структуру данных, где каждый из этих элементов являются различные (не POJO) классов:

root 
    + A 
    + B 
     + i 
     + 1 
     + 2 

а теперь, может быть, я хочу, чтобы реорганизовать так, что экземпляры A в настоящее время дети B, а содержимое i дробятся и переехал отдельно:

root 
    + i.1 
    + C 
     + i.2 
     + B 
      + A 
      + 1 
      + 2 
     + B 
      + A 
      + 1 
      + 2 

Я не уверен, что это означает именно то, что я хочу сделать, но это часть моей заботы. Мы не уверены, что знаем, какую модель данных мы хотим, и мы не можем быть уверены, что в будущем мы ее не изменим. Я не просто добавляю, удаляю или переименовываю объекты: я бы хотел переместить/скопировать их.

Xstream и JAXB отлично подходят для сериализации объекта, если обратная совместимость не является проблемой. XStream имеет FAQ, описывающий решения для простых изменений, но мне интересно, если их рекомендация «реализовать собственный конвертер» для достаточно сложных случаев подразумевает, что я должен просто пропустить xstream вообще. Другие люди задали вопросы related.

Могу ли я использовать xstream/JAXB для поддержки чтения различных форматов данных, которые я проиллюстрировал в одной и той же модели данных? Я думаю, что нет, потому что я слишком неопытен, чтобы быть уверенным.

ответ

0

Я дал xstream выстрел, и он сработал. Я начал путем регистрации конвертера только для тега верхнего уровня:

TopLevel topLevel = new TopLevel(); 
xstream = new XStream(new DomDriver()); 
xstream.registerConverter(new TopLevelConverter(topLevel)); 
xstream.alias("TopLevel", TopLevel.class); 
xstream.fromXML(data); 

и каждый преобразователь вводит новый преобразователь (ы) для каждого последующего типа узла, например, в TopLevelConverter:

public Object unmarshal(HierarchicalStreamReader reader, 
         UnmarshallingContext context) { 
    while (reader.hasMoreChildren()) { 
     reader.moveDown(); 
     if("SecondLevel".equals(reader.getNodeName())){ 
      SecondLevel secondLevel = 
       (SecondLevel)context.convertAnother(topLevel, 
        SecondLevel.class, 
        new SecondLevelConverter(topLevel)); 
      topLevel.add(secondLevel); 
     } 
     reader.moveUp(); 
    } 
    return topLevel; 
} 

где SecondLevelConverter в свою очередь также вызывает convertAnother. Таким образом, я мог делать все, что захотел, передавая объекты через конструктор конвертера: иногда данные отправлялись вниз для использования детьми, а иногда ссылки более высокого уровня отправлялись вниз, чтобы дети-конвертеры могли вызвать методы набора.

Однако, похоже, это похоже на то, что я бы сделал без xstream, поэтому я не уверен, что xstream купил меня в этой конкретной ситуации.