десериализация XML-файла из xstream

#java #deserialization #xstream

#java #десериализация #xstream

Вопрос:

Я использую Xstream для сериализации объекта Job. Похоже, что все работает нормально.

но при десериализации у меня возникла проблема:

 Exception in thread "main" com.thoughtworks.xstream.io.StreamException:  : only whitespace content allowed before start tag and not . (position: START_DOCUMENT seen .... @1:1) 
    at com.thoughtworks.xstream.io.xml.XppReader.pullNextEvent(XppReader.java:78)
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.readRealEvent(AbstractPullReader.java:137)
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.readEvent(AbstractPullReader.java:130)
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.move(AbstractPullReader.java:109)
    at com.thoughtworks.xstream.io.xml.AbstractPullReader.moveDown(AbstractPullReader.java:94)
    at com.thoughtworks.xstream.io.xml.XppReader.<init>(XppReader.java:48)
    at com.thoughtworks.xstream.io.xml.XppDriver.createReader(XppDriver.java:44)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:845)
  

Кто-нибудь из вас сталкивался с этой проблемой раньше?

Именно так я поступил для сериализации:

 XStream xstream = new XStream();                    
Writer writer = new FileWriter(new File("model.xml"));
writer.write(xstream.toXML(myModel));
writer.close();
  

Я также пробую это:

 XStream xstream = new XStream();                    
OutputStream out = new FileOutputStream("model.xml");
xstream.toXML(myModel, out);
  

Для десериализации я сделал это следующим образом:

 XStream xstream = new XStream();

xstream.fromXML("model.xml");
  

Структура XML:

 <projectCar.CarImpl> 
   <CarModel reference="../.."></CarModel>
</projectCar.CarImpl> 
  

Если да, я хотел бы услышать. Заранее спасибо.

Комментарии:

1. Нет. Но если бы вы включили XML или хотя бы первые пару его строк, я мог бы помочь.

2. Как выглядит ваш XML-документ, по крайней мере, в начале?

3. <projectCar.CarImpl> <имя>CarModel</name> Это первые строки моего xml.

4. именно так я поступил для сериализации: XStream xstream = new XStream(); Writer writer = new FileWriter(новый файл(«model.xml «)); writer.write(xstream.ToXML(MyModel)); writer.close();

5. Я думаю, вам следует попробовать просто xstream.toXMl( myModel, writer ); , иначе у вас могут возникнуть проблемы с кодировкой, которые могут вызвать это. И flush() средство записи перед его закрытием, просто на всякий случай.

Ответ №1:

fromXML не принимает имя файла, попробуйте:

 File xmlFile = new File("model.xml");
xstream.fromXML(new FileInputStream(xmlFile));
  

для чтения содержимого файла в виде строки.

Также имена полей ‘id’ и ‘reference’ являются ‘системными атрибутами’ в XStream. Используя следующий код:

 CarImpl myModel = new CarImpl();

File xmlFile = new File("model.xml");

XStream xstream = new XStream();
xstream.useAttributeFor(String.class);
xstream.useAttributeFor(Integer.class);

Writer writer = new FileWriter(xmlFile);        
writer.write(xstream.toXML(myModel));
writer.close();

CarImpl fromXML = (CarImpl) xstream.fromXML(new FileInputStream(xmlFile));
System.out.println(fromXML);
  

отмена сопоставления завершается ошибкой, если поля называются ‘id’ и ‘reference’, но в противном случае выполняется успешно. Смотрите ЧАСТО задаваемые вопросы по XStream

Взгляните на новый метод ‘aliasForSystemAttribute’ для возможного решения.

Комментарии:

1. Привет, спасибо. Та же проблема после десериализации: перед тегом start допускается только содержимое пробелов, а не «».

2. Может быть, файл не может быть найден? Убедитесь, что вы записываете сериализованный XML в тот же файл, из которого пытаетесь его прочитать.

3. Можете ли вы предоставить код ваших классов модели? Вы использовали аннотации для псевдонимирования атрибутов или вы делали это с помощью useAttributeДля вызовов?

4. нет, сериализация в XMl в порядке. но десериализация — это проблема. Я не могу предоставить код моих классов модели. он находится в библиотеке Java, я могу получить только класс implementate.

5. @Joesy: Я ставлю на знак порядка байтов в начале файла, хотя я не понимаю, как спецификация преобразуется в точку. Итак… Забудьте о своем другом SOF-вопросе и просто скачайте шестнадцатеричный редактор. Есть много хороших бесплатных (погуглите). Я использую один под названием NEO, но в нем «ничего особенного». Приветствия. Кит.