Десериализация 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 учебный класс.

Другие вопросы по тегам