Обратная совместимость в xstream - PullRequest
1 голос
/ 13 июня 2009

Я использую маленький кусочек xstream для сериализации.

У меня есть следующий класс:

// version 0
class A {
}

// version 1
class A {
    Object o = new Object();
}

Чтобы прочитать XML-файл версии 0 для создания класса А версии 1, мне потребуется добавить следующий метод в класс А версии 1:

class A {
    private Object readResolve() 
    { 
        /* For backward compatible */ 
        if (o == null) { o = new Object(); }
    }
    Object o = new Object();
}

Пока все отлично.

Теперь ситуация меняется на противоположную.

У меня есть следующий класс:

// version 0
class A {
    Object o = new Object();
}

// version 1
class A {
}

Как я могу сделать чтение XML-файла версии 0, чтобы построить класс A версии 1?

Вот исключение, которое вы получите, если попытаетесь это сделать:

run:
com.thoughtworks.xstream.converters.ConversionException: a : a
---- Debugging information ----
message             : a : a
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : a : a
class               : javaapplication15.Main$A
required-type       : javaapplication15.Main$A
path                : /javaapplication15.Main$A/a
line number         : 2
-------------------------------
null
BUILD SUCCESSFUL (total time: 2 seconds)

Ответы [ 2 ]

1 голос
/ 28 июня 2009

В настоящее время у меня обратная совместимость с использованием следующей стратегии:

// version 0
class A {
    Object o = new Object();
}

// version 1
class A {
    // This will ensure o will not be be read, or be written into file. 
    // transient keyword which prevent read, will only work well for xstream 1.3.1
    transient Object o = new Object();
}

// version 2. Slowly phase out Object o, after class A had been deployed for quite sometime.
class A {
}
0 голосов
/ 13 июня 2009

Вы могли бы зарегистрировать пользовательский конвертер для класса A, который дает вам контроль над сообщениями MSRhalling и Unmarshalling. Это довольно тяжелое решение, и делает XStream менее привлекательным.

Именно из-за таких случаев я склонен избегать XStream для всего, кроме очень тривиальных ситуаций, и никогда для ситуаций, когда XML может сохраняться после жизненного цикла запущенного приложения. Это просто слишком хрупко (и глючит). Более надежная структура сортировки может быть выбрана по выбору, даже если для ее конфигурирования требуется больше предварительных усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...