Ошибка при десериализации XML с SQL Server - PullRequest
0 голосов
/ 07 июля 2010

У меня есть приложение, которое сериализует и десериализует объекты .NET в XML. При десериализации я получаю следующую ошибку:

"Ошибка в XML Документ (1,2) Имя не может начинаться с "." символ, шестнадцатеричное значение 0x00. Строка 1, позиция 2. "

Фрагмент кода, который выполняет десериализацию:

string xmlEntity = _loanReader["LoanEntity"].ToString();
XmlSerializer xs2 = new XmlSerializer(typeof(Model.Loan));
MemoryStream memoryStream2 = new MemoryStream(StringFunction.StringToUTF16ByteArray(xmlEntity));
XmlTextWriter xmlTextWriter2 = new XmlTextWriter(memoryStream2, Encoding.Unicode);
_loan = (Model.Loan)xs2.Deserialize(memoryStream2);

Я использую средство чтения данных, чтобы получить набор результатов из хранимой процедуры. LoanEntity - это поле типа XML в таблице ссуд.

Фрагмент XML-файла, хранящегося в поле:

<Loan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GUID>d2cc9dc3-45b0-44bd-b9d2-6ef5e7ddb54c</GUID><LoanNumber>DEV999999</LoanNumber>
....

Я потратил бесчисленные часы, пытаясь понять, что означает ошибка, но безрезультатно. Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 07 июля 2010

Обычно это проблема с кодировкой.Я вижу, у вас есть строка, преобразованная в байтовый массив UTF16.Вы проверили, что это не должно быть UTF8 вместо этого?Я хотел бы попробовать и посмотреть, что из этого выйдет.По сути, десериализатор может искать другую кодировку.

0 голосов
/ 07 июля 2010

Полагаю, я нашел решение этой проблемы. Поскольку в поле XML SQL Server ожидается кодирование значений типа Unicode, я попытался использовать StringReader вместо MemoryStream, и пока все работает хорошо. Помогла также следующая запись StackOverFlow:

Использование StringWriter для сериализации XML

0 голосов
/ 07 июля 2010

Вы, должно быть, работаете из старого и плохого примера. Попробуйте это:

string xmlEntity = _loanReader["LoanEntity"].ToString();
XmlSerializer xs2 = new XmlSerializer(typeof(Model.Loan));
using (MemoryStream memoryStream2 = new MemoryStream(StringFunction.StringToUTF16ByteArray(xmlEntity)))
{
    XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.Unicode};
    using (XmlWriter writer = XmlWriter.Create(memoryStream2, settings))
    {
        _loan = (Model.Loan)xs2.Deserialize(memoryStream2);
    }
}
...