为什么在更新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>
感谢您的帮助!!!
答案 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);
}