我写了下面的通用代码,将XML文件反序列化为一个列表:
public List<T> getList<T>(string fPath)
{
FileStream fs;
fs = new FileStream(fPath, FileMode.Open);
List<T> list;
XmlSerializer xmls = new XmlSerializer(typeof(List<T>));
list = (List<T>)xmls.Deserialize(fs);
fs.Close();
return list;
}
但我在绝望行动中得到了例外。
&#34; System.Xml.dll中发生了
System.InvalidOperationException
类型的异常,但未在用户代码中处理#34;
这是XML文件的示例:
<?xml version="1.0"?>
<ArrayOfAdmin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Admin>
<MyUsername>User</MyUsername>
<MyPassword>Pass</MyPassword>
</Admin>
</ArrayOfAdmin>
什么导致异常?
答案 0 :(得分:2)
首先,您的文件应包含带有序列化List<T>
对象的有效xml数据。例如。如果你有序列化的整数列表与项目1和2 xml应该这样:
<?xml version="1.0"?>
<ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<int>1</int>
<int>2</int>
</ArrayOfInt>
或使用您的自定义类型:
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person>
<Id>1</Id>
<Name>Bob</Name>
</Person>
<Person>
<Id>2</Id>
<Name>Joe</Name>
</Person>
</ArrayOfPerson>
当文件为空或者数据无效时,您将在反序列化尝试期间获得InvalidOperationException
。阅读此异常的属性Message
以获取一些详细信息。例如。如果file为空,则表示缺少root元素。
注意:当您使用非托管资源时,最好使用using
构造在发生异常时正确关闭/处置此类资源。
using (var stream = File.Open(fPath, FileMode.Open))
{
var serializer = new XmlSerializer(typeof(List<T>));
return (List<T>)serializer.Deserialize(stream);
}