2012-01-26 10 views
0

Я пытаюсь написать класс, который позволит мне просто написать .save(); для создания постоянных копий дочерних классов. Я создал метод, который создает XML:CannotResolveClassException при чтении XML-файла в методе

public boolean save() throws IOException{ 
    XStream xstream = new XStream(new KXml2Driver()); 

    FileWriter extenceWriter = new FileWriter(saveFile); 
    xstream.alias(this.getClass().getSimpleName(), this.getClass()); 
    xstream.toXML(this, extenceWriter); 

    return saveFile.exists(); 
} 

и еще один, который должен прочитать его:

public Object loadFile(String path) throws FileNotFoundException{ 
    File file = new File(appRootDIR + File.separator + path); 

    XStream xstream = new XStream(new KXml2Driver()); 
    FileReader extenceReader = new FileReader(file); 

    return xstream.fromXML(extenceReader); 
} 

Проблема заключается в том, что я получаю com.thoughtworks.xstream.mapper.CannotResolveClassException когда Я пытаюсь использовать loadFile().
Я проверил google и самый близкий хит был в том, что разные экземпляры xstream не могут общаться.
Это можно решить, перемещая xstream в поле класса, но затем я получаю некоторые ошибки относительно того, что xstream не может сериализоваться.

Есть ли хороший способ реализовать как методы чтения, так и записи в классе без необходимости создания экземпляра xstream вне поля?

ответ

0

Поскольку вы используете псевдоним в save(), простое имя класса, а не полное имя класса, записывается в XML. Это делает loadFile() неспособным выяснить, к какому классу он относится.

Вы можете исправить это одним из двух способов:

  1. Не используя сглаживание - простой, но XML не будет как чистый вид.
  2. сделать метод, который регистрирует все псевдонимы, которые вы хотите использовать на XStream, например, и вызвать этот метод из обоих save() и loadFile() так, чтобы они могли работать с тем же набором псевдонимов.
+0

Благодарим за помощь! Вариант один работает отлично. Не удалось выяснить, как зарегистрировать псевдонимы, но я попробую. –

Смежные вопросы