将XML文件反序列化为列表错误

时间:2016-01-28 13:36:22

标签: c# xml list serialization

我写了下面的通用代码,将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>

什么导致异常?

1 个答案:

答案 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);
}