.NET 解决XML反序列化出现 XML文档(0, 0)中有错误 缺少根元素。

项目中在进行XML反序列化时,出现 "XML文档(0,0)中有错误 缺少根元素"的错误信息。

出现这种错误首先验证XML文档的格式是否有问题,如果XML文档的格式是正确的话,那么下面才来排除是否是程序的问题。 

下面是原程序中对文档进行反序列化的代码 :

string strBody = string.Empty;
object obj = null;
using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(stream))
    {
        sw.Write(Encoding.UTF8.GetBytes(strBody));
        sw.Flush();
        try
        {
            //此处反序列化的时候会报错
            obj = serializer.Deserialize(stream);
        }
        catch (Exception ex)
        {
            obj = default(T);
        }
    }
}

在执行到obj = serializer.Deserialize(stream);这句代码的时候出错,提示"XML文档(0, 0)中有错误 缺少根元素"。本来这个错误应该是因为XML文档格式错误导致的,但在XML文档格式没有错误的情况下,那就是这句代码出了问题。

由于在进行XML反序列化之前,有对流进行过写入操作(执行了sw.Write(Encoding.UTF8.GetBytes(strBody))这句代码),这样就会造成当前流所在起始位置发生改变,流的位置就会处于最后读取的位置。上面代码是将整个XML文档读取完,所以最终流的位置是XML文档的尾部。而序列化是从流最后的位置开始读取,所以读取到是空白的XML文档,空白的XML文档自然会提示缺少根元素了。

解决方法是只要我们在反序列化XML文档之前,先将流的位置设置成起始位置,即0坐标,就可以正确反序列化出XML文档, 可以使用Seek方法或者Position属性进行设置。

具体代码如下 :

string strBody = string.Empty;
object obj = null;
using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(stream))
    {
        sw.Write(Encoding.UTF8.GetBytes(strBody));
        sw.Flush();
        //有两种设置方法,一种是设置Position属性,一种是调用Seek方法                    
        //设置Position属性代码: stream.Position=0;
        stream.Seek(0, SeekOrigin.Begin);
        try
        {
            obj = serializer.Deserialize(stream); 
        }
        catch (Exception ex)
        {
            obj=default(T); 
        }
    }
}

 




原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98300.html

(0)
上一篇 2021年8月21日
下一篇 2021年8月21日

相关推荐

发表回复

登录后才能评论