Ошибка десериализации XML - PullRequest
       12

Ошибка десериализации XML

2 голосов
/ 31 августа 2009

Я десериализирую следующий XML-файл. Использование XML-сериализатора с VSTS 2008 + C # + .Net 3.5.

Вот файл XML.

<?xml version="1.0" encoding="utf-8"?>
<Person><Name>=b?olu</Name></Person>

Вот снимок экрана для отображения файла XML и двоичного формата файла XML,

alt text

alt text

Если есть какие-то решения для принятия таких персонажей, это будет здорово! Поскольку мой XML-файл большой, и если такие символы действительно недопустимы и должны быть отфильтрованы, я хочу сохранить оставшееся содержимое XML-файла после десериализации.

В настоящее время десериализация XML завершается с ошибкой InvalidOperationException, и вся информация файла XML будет потеряна.

На самом деле при открытии этого XML-файла в VSTS возникает ошибка, подобная этой, ошибка 1 символа '?', Шестнадцатеричное значение 0xffff недопустимо в документах XML. Я в замешательстве, поскольку в двоичной форме нет значений 0xffff.

Какие-нибудь решения или идеи?

EDIT1: вот мой код, который используется для десериализации XML-файла,

    static void Foo()
    {
        XmlSerializer s = new XmlSerializer(typeof(Person));
        StreamReader file = new StreamReader("bug.xml");
        s.Deserialize(file);
    }

public class Person
{
    public string Name;
}

Ответы [ 3 ]

1 голос
/ 31 августа 2009

Вы пробовали использовать DataContractSerializer? Я столкнулся с интересной ситуацией, когда кто-то копировал и вставлял некоторые слова или файлы Excel в мое веб-приложение: строка содержала недопустимые управляющие символы (такие как вертикальная табуляция). К моему удивлению, это было сериализовано при отправке в службу WCF и даже считывало 100% оригинал при запросе. Чистая среда .net не имела проблем с этим, поэтому я предполагаю, что DataContractSerializer может обрабатывать такие вещи (что, однако, является ИМХО нарушением спецификации XML).

У нас был другой клиент Java, обращающийся к той же службе - он не смог получить эту запись ...

[Изменить после уродливого формата в моем комментарии ниже]

Попробуйте это:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyType));
using (XmlWriter xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8)) 
{ 
  serializer.WriteObject(xmlWriter, instanceOfMyType);
}
using (XmlReader xmlReader = new XmlTextReader(filePath))
{
  MyType = serializer.ReadObject(xmlReader) as MyType;
}

Комментарий второго Марка о привычке DataContractSerializer делать XmlElements вместо XmlAttributes:

<AnElement>value</AnElement> 

вместо

<AnElement AnAttribute="value" />
1 голос
/ 31 августа 2009

Этот стиль помогает?

<name>
   <![CDATA[
     =b?olu
   ]]>
</name>

Либо это, либо кодировка должны помочь.

РЕДАКТИРОВАТЬ: Найдено на этой странице: http://www.eggheadcafe.com/articles/system.xml.xmlserialization.asp. В частности, этот код для десериализации:

public Object DeserializeObject(String pXmlizedString)
 {
     XmlSerializer xs = new XmlSerializer(typeof(Automobile));
     MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
     return xs.Deserialize(memoryStream);
  } 

Эта часть о "StringToUTF8ByteArray" и "Encoding.UTF8" выглядит странно отсутствующей у вас. Я предполагаю, что .NET не нравится читать кодировку вашего фактического файла XML ...?

0 голосов
/ 17 сентября 2009

«Недопустимые символы» выглядят так, как будто они предназначены для кодирования символов Юникода. Возможно, они неправильно используют кодировку?

Можете ли вы спросить у авторов этого документа, какой символ они имели в виду , чтобы включить в это место? Может быть, спросить их, как они сгенерировали документ?

...