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

时间:2011-04-25 01:43:49

标签: c# visual-studio-2010 serialization xmlserializer deserialization

为什么在更新Visual Studio 2010后Deserialize抛出异常?

编辑(问题变更):
我通过移除using语句并在Dispose上手动调用TextReader gTr来解决问题。

新问题:
为什么using语句在使用TextReader(更新后)阅读时会导致错误?

我对此感到困惑。我所做的只是更新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>

感谢您的帮助!!!

2 个答案:

答案 0 :(得分:1)

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

此外,您的代码在我的visual studio 2010 SP1上运行良好;

答案 1 :(得分: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);
}