XStream fromXML () исключение - PullRequest
3 голосов
/ 16 июня 2009

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

Исключение, если строка или объект 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)
на com.thoughtworks.xstream.XStream.fromXML (XStream.java:853)

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

com.thoughtworks.xstream.converters.ConversionException: ByteSize: ByteSize: ByteSize: ByteSize
---- Отладочная информация ----
сообщение: ByteSize: ByteSize
причина-исключение: com.thoughtworks.xstream.mapper.CannotResolveClassException
причина-сообщение: ByteSize: ByteSize
класс: MyClass
требуемый тип: MyClass
путь: / MyClass / ByteSize
в com.thoughtworks.xstream.core.TreeUnmarshaller.convert (TreeUnmarshaller.java:89)
в com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert (AbstractReferenceUnmarshaller.java:63)
в com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:76)
в com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother (TreeUnmarshaller.java:60)
на com.thoughtworks.xstream.core.TreeUnmarshaller.start (TreeUnmarshaller.java:137)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal (AbstractTreeMarshallingStrategy.java:33)
на com.thoughtworks.xstream.XStream.unmarshal (XStream.java:923)
на com.thoughtworks.xstream.XStream.unmarshal (XStream.java:909)
на 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);
}

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

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

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

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

Object obj = xStream.fromXML(new FileReader(xmlFile));
4 голосов
/ 16 июня 2009

Посмотрите на этот вопрос: содержимое не разрешено в исключении пролога .

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

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

0 голосов
/ 16 июня 2009

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

...