Проблема XML-сериализации / десериализации - PullRequest
0 голосов
/ 19 августа 2010

После записи и чтения строки XML в поток и из него он перестает быть десериализуемым. Новая строка обрезается.

string XmlContent = getContentFromMyDataBase();
XmlSerializer xs = new XmlSerializer(typeof(MyObj));
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
char[] ca = XmlContent.ToCharArray();      // still working up to this point.
ms.Position = 0;
sw.Write(ca);
StreamReader sr = new StreamReader(ms);
ms.Position = 0;
string XmlContentAgain = sr.ReadToEnd();
Console.WriteLine(XmlContentAgain);        // (outputstring is too short.)
MyObj theObj = (MyObj)xs.Deserialize(ms);  // Can't deserialize.

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

Кроме того, myObj имеет общий элемент словаря, который обычно не сериализуем, поэтому я украл код у Пола Уэлтера для его сериализации.

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

Попробуйте очистить и утилизировать или, что еще лучше, упростить код с помощью StringReader :

string xmlContent = getContentFromMyDataBase();
var xs = new XmlSerializer(typeof(MyObj));
using (var reader = new StringReader(xmlContent))
{
    var theObj = (MyObj)xs.Deserialize(reader);
}

Примечание: метод getContentFromMyDataBase также предполагает, что вы храните XML в своей базе данных, которую вы десериализуете обратно в объект. Не.

0 голосов
/ 19 августа 2010

Вам необходимо очистить или закрыть (неявно завершить сброс) StreamWriter, или вы не можете быть уверены, что он завершил запись в базовый поток.Это потому, что он выполняет некоторую внутреннюю буферизацию.

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

using(StreamWriter sw = new StreamWriter(ms)) 
{
    char[] ca = XmlContent.ToCharArray();      // still working up to this point.
    ms.Position = 0;
    sw.Write(ca);
}
StreamReader sr = new StreamReader(ms);
ms.Position = 0;
string XmlContentAgain = sr.ReadToEnd();
...