2009-06-12 5 views
1

Я использую красивый маленький кусок xstream для выполнения сериализации.Обратный Совместим в xstream

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

// version 0 
class A { 
} 

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

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

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, для построения класса А версии 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) 
+0

Что XStream сказать, если вы десериализации с использованием XML-документ с дополнительным материалом в нем? –

ответ

1

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

// 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

Как описано в FAQ XStream: http://xstream.codehaus.org/faq.html#Serialization_newer_class_versions –

0

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

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

+0

«Вы можете зарегистрировать пользовательский конвертер для класса А» -> Можете ли вы описать более подробно? Это утверждение слишком абстрактно для меня. –

+0

Класс XStream позволяет регистрировать преобразователи, которые рассказывают, как конвертировать объекты в и из XML. Вы можете написать тот, который знает, как обращаться с объектами класса A. – skaffman