2010-08-19 3 views
0

После записи и чтения строки xml в поток и из потока он перестает быть десериализуемым. Новая строка обрезается.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 имеет общий член словаря, который обычно не является сериализуемым, поэтому я украл код от Paul Welter, чтобы его сериализовать.

ответ

2

Try смыва и утилизации или даже лучше упростить код, используя 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

Почему вы не храните XML в базе данных? – Mark

+0

Поскольку база данных SQL является реляционной. XML является иерархическим. Они несовместимы. База данных предназначена для хранения данных, а не для хранения представления данных (это XML). –

+3

XML - это текст. Базы данных очень хороши при хранении текста. Весьма удобно хранить XML в базе данных. Ваше различие между «данными» и «представлением данных» произвольно и бессмысленно. – Mark

0

Вам необходимо очистить или закрыть (закрытие неявно сбрасывает) 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(); 
+0

Это не работает. Поток становится недоступным после блока использования. Перемещение кода извне внутрь приводит к тем же проблемам, что и раньше. – user420667

+0

Это связано с тем, что утилизация StreamWriter также предоставляет базовый объект. Вы можете получить буфер из потока, или вы можете вызвать Flush на своем автору, а не удалять его. – driis

Смежные вопросы