2009-06-16 2 views
3

Я пытаюсь десериализовать строку на Java с помощью пакета XStream. Пакет XStream может сериализовать мой класс. Я получаю XML (не могу изменить формат XML) с сервера и пытаюсь сохранить его информацию о узле в соответствующие переменные в определенном классе. Моя функция находится внизу, и я попытался зарегистрировать новый конвертер для объекта XStream (считая, что это потому, что одна переменная является массивом байтов), но все равно не повезло. Может ли кто-нибудь пролить свет на эти исключения? Нужно ли регистрировать «MyClass» и написать собственный конвертер для XStream для десериализации моего класса? Заранее спасибо.XStream fromXML() exception

Исключение, если строка или объект StringReader передаются в FromXml() в качестве входных данных:

[фатальную ошибку]: 1: 1: Содержимое не допускается в прологе.
com.thoughtworks.xstream.io.StreamException: Содержимое не допускается в прологе.
на com.thoughtworks.xstream.io.xml.DomDriver.createReader (DomDriver.java:86)
на com.thoughtworks.xstream.io.xml.DomDriver.createReader (DomDriver.java:66)
на ком .thoughtworks.xstream.XStream.fromXML (XStream.java:853)

Исключение, если ByteArrayInputStream используется в качестве входных данных для FromXml():

com.thoughtworks.xstream.converters.ConversionException: ByteSize : ByteSize: ByteSize: ByteSize
---- Debuggi Информация нг ----
сообщение: ByteSize: ByteSize
причинно-исключение: com.thoughtworks.xstream.mapper.CannotResolveClassException
причинно-сообщение: ByteSize: ByteSize
класс: MyClass
требуется тип: MyClass
путь:/МойКласс/ByteSize
в com.thoughtworks.xstream.core.TreeUnmarshaller.convert (TreeUnmarshaller.java:89)
в com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert (AbstractReferenceUnmarshaller.java:63)
at com.though tworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:76)
в com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:60)
в com.thoughtworks.xstream.core.TreeUnmarshaller. начать (TreeUnmarshaller.java:137)
на com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal (AbstractTreeMarshallingStrategy.java:33)
в com.thoughtworks.xstream.XStream.unmarshal (XStream.java:923)
at com.thoughtworks.xstream.XStream.unmarshal (XStream.java:909)
at com.thoughtworks.xstream.XStream.fromXML (XStream.java:861)

static Object fromXmlString(String xml) 
{ 
    XStream xStream = new XStream(new DomDriver()); 
    xStream.registerConverter(new EncodedByteArrayConverter()); 
    //tried all 3 below 
    //return xStream.fromXML(new StringReader(xml)); 
    //return xStream.fromXML(new ByteArrayInputStream(xml.getBytes())); 
    return xStream.fromXML(xml); 
} 

ответ

4

Посмотрите на этот вопрос: content not allowed in prolog exception.

«Недопустимый контент в прологе» обычно означает, что перед заголовком <?xml («пролог») есть файл. Это запрещено.

Итак, убедитесь, что в строке нет символов до <?xml, а также у вас нет BOM вопросов.

+0

Вы верны. когда я распечатываю входной поток, который передается, есть три нежелательных символа перед 2009-06-16 14:51:30

+0

Итак, вам просто нужно убедиться, что контент удаляется, прежде чем пытаться десериализовать его. Я предлагаю вам либо сделать это самостоятельно до вызова XStream, либо если эти данные поступают от кого-то другого, скажите им, чтобы они исправили это. –

+0

Я удалил ненужные символы на моем конце, убедившись, что строка «начинает с» правильного заголовка xml. но теперь я получаю исключение ConversionException выше даже с String в качестве входных данных (где в качестве строки ранее указывалось, что «контент не разрешен в прологе») – 2009-06-16 14:59:17

0

Это ваш десериализационный/декодирующий экземпляр XStream, сконфигурированный в тем же способом как ваш экземпляр XStream для кодирования? Я бы проверил последнее и обеспечил, чтобы один и тот же экземпляр XStream мог кодировать/декодировать.

+0

Строка XML на самом деле кодируется в C#, поэтому я не могу сравнивать ее. Я полагаю, что они используют класс XmlSerializer, предоставленный .net – 2009-06-16 14:48:50

+0

Я думаю, что у вас может быть много работы перед вами (в зависимости от XML, который вы должны использовать для десериализации). Я бы ожидал, что XStream предположит, что он также выполняет сериализацию. Возможно, стоит опубликовать XML, который вы хотите отменить. –

+0

В XML нет ничего особенного. Это всего лишь корневой узел и около 25 дочерних узлов разных типов данных (байтовый массив, строка, int, boolean). Я согласен, что это можно считать XStream сериализовано данных Пример XML не десериализации верно Пример текста ... 2009-06-16 15:03:03

4

Это проблема с кодировкой. Из XStream documentation:

«Все реализации HierarchicalStreamDriver соблюдать кодировку начиная с версии 1.3, но только если вы предоставляете InputStream.»

Просто добавьте Reader, когда вы пытаетесь прочитать XML. Например:

Object obj = xStream.fromXML(new FileReader(xmlFile)); 
+0

Это сработало для меня. Проблема, с которой я столкнулся, - это когда я читаю XML-файл, сгенерированный функцией toXML. Когда я завернул файл с помощью FileReader, XStream начал правильно читать файл. –