Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml序列化/反序列化问题_C#_Serialization_Xml Serialization - Fatal编程技术网

C# Xml序列化/反序列化问题

C# Xml序列化/反序列化问题,c#,serialization,xml-serialization,C#,Serialization,Xml Serialization,在流中写入和读取xml字符串后,它将停止反序列化。新的绳子被剪断了 string XmlContent = getContentFromMyDataBase(); XmlSerializer xs = new XmlSerializer(typeof(MyObj)); MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms); char[] ca = XmlContent.ToCharArray();

在流中写入和读取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有一个通用字典成员,通常不可序列化,因此我从中窃取了代码以对其进行序列化。

您需要刷新或关闭(隐式关闭)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();

尝试刷新和处理,或者更好地使用以下命令简化代码:


注意:
getContentFromMyDataBase
方法还建议您将反序列化回对象的XML存储在数据库中。不要。

为什么不将XML存储在数据库中?因为SQL数据库是关系数据库。XML是分层的。它们不兼容。数据库用于存储数据,而不是存储数据的表示形式(即XML)。XML是文本。数据库非常擅长存储文本。将XML存储在数据库中是完全合适的。你对“数据”和“数据表示”的区别是武断的,毫无意义的。@马克,我不同意你的看法。XML本身可以被看作是存储数据的数据库,但在我看来,将数据库存储在另一个数据库中是错误的。XML以文本形式存储在数据库中。这不起作用。使用块后,流变得不可访问。将代码从外部移动到内部会导致与以前相同的问题,这是因为disposing StreamWriter也会处理底层对象。您可以从流中获取缓冲区,也可以调用writer上的Flush,而不是处理它。
string xmlContent = getContentFromMyDataBase();
var xs = new XmlSerializer(typeof(MyObj));
using (var reader = new StringReader(xmlContent))
{
    var theObj = (MyObj)xs.Deserialize(reader);
}