1

为什么Deserialize在更新Visual Studio 2010后引发异常?C#,为什么在Visual Studio更新后使用TextReader抛出异常?

EDIT(问题变化):
我把它通过消除using声明和TextReader gTr手动调用Dispose工作。

新问题:
为什么而与TextReader(更新之后)阅读做了using声明引起的错误?

我对此感到莫名其妙。我所做的只是更新Visual Studio,它不再有效。它在(几周)之前完全正常工作。它也匹配我读过的很多例子。我看不出有什么不对,或者如何缺少Root,或者如何有error in XML document (0, 0)

//EXCEPTION 
System.InvalidOperationException was caught 
Message=There is an error in XML document (0, 0). 
Source=System.Xml 
InnerException: System.Xml.XmlException 
Message=Root element is missing. 
LineNumber=0 
LinePosition=0 

//SERIALIZE 
SGlobalSettings gSettings = new SGlobalSettings(); 
XmlSerializer gXmls = new XmlSerializer(typeof(SGlobalSettings)); 
using (TextWriter gTw = new StreamWriter("global.xml")) 
{ 
    gXmls.Serialize(gTw, gSettings); 
} 

//DESERIALIZE 
if (File.Exists("global.xml")) 
{ 
    SGlobalSettings global; 
    XmlSerializer gXmls = new XmlSerializer(typeof (SGlobalSettings)); 
    using (TextReader gTr = new StreamReader("global.xml")) 
    { 
     global = (SGlobalSettings)gXmls.Deserialize(gTr); 
    } 
} 

//OBJECT 
[XmlRootAttribute("Global")] 
public class SGlobalSettings 
{ 
    public string key { get; set; } 
    public string last { get; set; } 

    public SGlobalSettings() { } 
} 

//XML 
<?xml version="1.0" encoding="utf-8" ?> 
<Global xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <key>KEY</key> 
    <last>LAST</last> 
</Global> 

感谢您的任何帮助!

+1

好像使用您的代码,是反序列化对我很好。确保在<?xml version =“1.0”encoding =“utf-8”?>'之前没有任何空格。 – 2011-04-25 01:58:14

+0

我只是执行上面的代码,序列化对象,然后反序列化,没有例外(VS2010)。也许别的东西导致它你没有包括在内? – StellarEleven 2011-04-25 02:00:59

+0

@Bala:我得到它的工作和编辑我的问题,以反映我的新发现。在空格的注释中,我不创建xml文件,它使用'XmlSerializer'通过上面的代码完全生成。 – PiZzL3 2011-04-25 02:01:09

回答

1

我以前有过完全相同的问题。 我最好的猜测是XmlSerializer正在寻找的“根元素”是一个与它试图反序列化的类型名称相同的元素。因此,改变你的XML以下内容应该工作:(更改以粗体显示)

<?xml version="1.0" encoding="utf-8" ?> 
<SGlobalSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <key>KEY</key> 
    <last>LAST</last> 
</SGlobalSettings> 

我不知道为什么会TextReader的不正确读取文件时自动配置,但你知道,有一个XmlSerializer.Deserialize超负荷接受Stream实例作为参数?使用这种超载可能会解决您的问题;可能存在多重过载,因为它们中的每一个都使用不同的基础流。这似乎与微软典型的隐藏式隐藏钩子同步。

我想尝试完全绕过的TextReader,并使用下面的代码来代替:

XmlSerializer gXmls = new XmlSerializer(typeof (SGlobalSettings)); 
using (Stream gStream = File.OpenRead("global.xml")) 
{ 
    global = (SGlobalSettings)gXmls.Deserialize(gStream); 
} 
+0

这不是问题。不知何故''使用''TextReader'搞砸了。 – PiZzL3 2011-04-25 02:06:11

+0

对不起,@ PiZzL3 ...我的错误。我没有在您的课堂上看到XmlRootAttribute,并且我在编辑之前回复了引导。我更新了我的答案以反映您的更改。 – 2011-04-25 02:41:04

1

(0,0)处的错误通常表示您的代码可以打开该文件,但该文件为空。尝试在序列化部分使用Flush()方法。

此外,您的代码在我的visual studio 2010 SP1上正常工作;

相关问题