Десериализация XML с использованием XStream не работает в OSGi (Java 1.4)
Я создал несколько OSGi-пакетов. Один из них имеет функцию экспорта данных в xml с использованием XStream. Это просто отлично работает. Также работает импорт при использовании Bundle в качестве библиотеки, а не в контексте OSGi.
Но если я вызываю свой импорт в другом пакете, я получаю "com.thoughtworks.xstream.converters.ConversionException" со следующей распечатанной Отладочной информацией:
---- Debugging information ----
message : Cannot find class ChildDate
cause-exception : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message : Cannot find class ChildData
class : ChildData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
message : Could not call ParentData.readObject()
cause-exception : com.thoughtworks.xstream.converters.ConversionException
cause-message : Cannot find class ParentData : Cannot find class ChildData
class : ParentData
required-type : ChildData
path : /ParentData/ChildData
-------------------------------
Я думаю, что проблема похожа на это: XStream и OSGi или это: CannotResolveClassException в среде OSGi
Поэтому я попытался решить эту проблему, установив ClassLoader. Но это не работает.
Части моего класса ParentData:
public class ParentData implements Serializable {
// [...]
private static ClassLoader classLoaderForImport = ParentData.class.getClassLoader();
// [...]
public static void setClassLoaderForImport(ClassLoader classLoaderForImport) {
ParentData.classLoaderForImport = classLoaderForImport;
}
// [...]
public static Lumicon importFromXMLFile(String path) {
return importFromFile(new DomDriver(), path);
}
private static ParentData importFromFile(HierarchicalStreamDriver driver, String path) {
try {
XStream xstream = new XStream(driver);
//set the classloader as the default one won't work in any case
xstream.setClassLoader(ParentData.classLoaderForImport);
xstream.alias("ParentData", classLoaderForImport.loadClass(ParentData.class.getName()));//ParentData.class);
xstream.alias("ChildData", classLoaderForImport.loadClass(ChildData.class.getName()));//ChildData.class);
Reader reader = new FileReader(path);
Object object = xstream.fromXML(reader);
return (ParentData) object;
} catch (ClassNotFoundException ex) {
System.out.println("This did not work.");
} catch (FileNotFoundException e) {
System.out.println("File " + path + " not found.");
}
}
// [...]
}
Функция xstream.fromXML(reader)
не работает, но classLoaderForImport.loadClass(ChildData.class.getName())
не подведет
Вот как я это называю из другого комплекта:
ParentData.setClassLoaderForImport(ParentData.class.getClassLoader());
data = ParentData.importFromXMLFile(path); // this is where the Exception happens
Я тоже пробовал this.getClass().getClassLoader()
а также ChildData.class.getClassLoader()
Может ли быть так, что это не работает, потому что эта функция вызывается из третьего пакета?
Еще немного информации:
- Версия Java: 1.4 (нет, не могу обновить до 1.5 или 1.6)
- Среда исполнения: J2SE-1.6
- Maven версия: 2.2.1
- Работает с Pax Runner (1.5.0) из OPS4J - http://www.ops4j.org/
- OSGi: Equinox 3.6.0
- XStream 1.3.1 (com.springsource.com.thoughtworks.xstream)
Любая помощь будет приветствоваться!
1 ответ
Предполагая, что ваш вопрос содержит весь соответствующий код, проблема определяется следующим:
Could not call ParentData.readObject()
Вы заявили, что ваш ParentData implements Serializable
, Хотя Serializable
Интерфейс не включает никаких методов, и Java-сериализация и XStream ожидают readObject
и writeObject
, Я немного увлечен точными ситуациями, в которых они являются обязательными, но я бы посоветовал вам удалить implements Serializable
от ParentData
учебный класс.