【问题标题】:deserialize XML file into a list error将 XML 文件反序列化为列表错误
【发布时间】:2016-01-28 13:36:22
【问题描述】:

我编写了以下通用代码将 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;
}

但我得到了反序列化操作的异常。

“System.Xml.dll 中出现System.InvalidOperationException 类型的异常,但未在用户代码中处理”

这是 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>

什么原因导致异常?

【问题讨论】:

标签: c# xml list serialization


【解决方案1】:

首先,您的文件应该包含带有序列化List&lt;T&gt; 对象的有效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 以获取一些详细信息。例如。如果文件为空,则表示缺少根元素。

注意:当您使用非托管资源时,最好使用using 构造来正确关闭/处置此类资源,以防出现异常。

using (var stream = File.Open(fPath, FileMode.Open))
{
    var serializer = new XmlSerializer(typeof(List<T>));
    return (List<T>)serializer.Deserialize(stream);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多