Исключение XStream fromXML()

Я пытаюсь десериализовать строку в 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)
на com.thoughtworks.xstream.core.AbstractT reeMarshallingStrategy.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);
}

person Community    schedule 16.06.2009    source источник


Ответы (3)


Взгляните на этот вопрос: контент не разрешен в исключении пролога.

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

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

person matt b    schedule 16.06.2009
comment
Ты прав. когда я распечатываю введенную строку, перед ‹?xml есть три ненужных символа. - person ; 16.06.2009
comment
Итак, вам просто нужно убедиться, что контент удален, прежде чем пытаться его десериализовать. Я бы посоветовал вам сделать это самостоятельно перед вызовом XStream или, если эти данные поступают от кого-то другого, попросить их исправить это. - person matt b; 16.06.2009
comment
Я удалил ненужные символы на своем конце, убедившись, что строка начинается с правильного заголовка xml. но теперь я получаю ConversionException выше даже со строкой в ​​качестве ввода (где ранее строка давала этот контент, не разрешенный в прологе) - person ; 16.06.2009
comment
Я считаю, что это связано с тем, что XStream не знает, какие классы сопоставлять с определенными элементами XML на основе их имени. Возможно, вы захотите взглянуть на регистрацию псевдонимов: xstream.codehaus.org/alias-tutorial.html - person matt b; 16.06.2009
comment
Я посмотрю больше на этот вариант. Спасибо за вашу помощь в очистке исключения пролога. - person ; 16.06.2009

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

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

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

Object obj = xStream.fromXML(new FileReader(xmlFile));
person Assaf Israel    schedule 02.04.2012
comment
Это сработало для меня. Проблема, с которой я столкнулся, заключалась в том, что я читал файл XML, созданный с помощью функции toXML. Когда я обернул файл с помощью FileReader, XStream начал правильно читать файл. - person Sivaram Kannan; 19.06.2013

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

person Brian Agnew    schedule 16.06.2009
comment
Строка XML на самом деле кодируется в C #, поэтому я действительно не могу сравнивать. Я считаю, что они используют класс XmlSerializer, предоставленный .net. - person ; 16.06.2009
comment
Я думаю, что у вас впереди много работы (в зависимости от XML, который вам нужно десериализовать). Я ожидаю, что XStream предположит, что он также выполнил сериализацию. Возможно, стоит опубликовать XML, который вам нужно десериализовать. - person Brian Agnew; 16.06.2009
comment
В XML нет ничего особенного. Это всего лишь корневой узел и около 25 дочерних узлов с различными типами данных (массив байтов, строка, целое число, логическое значение). Я согласен с тем, что можно предположить, что XStream сериализует данные Пример XML, который он не десериализует ‹root› ‹data1›1‹/data1› ‹data2›true‹/data2› ‹data3›Example Text‹/data3› ... ‹/root› - person ; 16.06.2009
comment
XStream должен будет сопоставить это с объектом Java (возможно, с именем root) с полями данных data1/data2 и т. д. - person Brian Agnew; 16.06.2009
comment
Знаете ли вы какие-либо наглядные примеры настройки новой карты для объекта XStream? - person ; 16.06.2009