用XmlSerializer.Deserialize将XML转实体遇到的问题
阅读原文时间:2023年08月29日阅读:1
  • 1、命名空间的问题

  • * 1.1 XML示例:

    ![](https://article.cdnof.com/2308/cdc7b353-d9d7-40b5-8230-2650597bb436.jpg)
  • * 1.2 反序列化代码:

    点击查看源代码
      ```
              public static object DeserializeFromXml<T>(string xmlFilePath)
              {
                  object result = null;
                  using (FileStream fs = new FileStream(xmlFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                  {
                      XmlSerializer xs = new XmlSerializer(typeof(T));
                      result = xs.Deserialize(fs);
                      fs.Close();
                      fs.Dispose();
                  }
                  return result;
              }
      ```
      &lt;/details&gt; </code></pre></li>
  • * 1.3 程序报异常:

    ![](https://article.cdnof.com/2308/549bbc85-add0-47f0-94bb-398b04ec5570.jpg)
  • * 1.4 修复异常:

    将1.2中代码里new XmlSerializer处增加命名空间;如下:  
    
    XmlSerializer xs = new XmlSerializer(type, "[http://www.w3.org/2000/09/xmldsig#](http://www.w3.org/2000/09/xmldsig#)");
  • 2、反序列化成实体时,List为空的异常

  • * 2.1 XML实例:

    ![](https://article.cdnof.com/2308/eb3e2f54-b127-4bad-9fb2-efe509fa1f44.png)
  • * 2.2 实体示例:

    ![](https://article.cdnof.com/2308/9d18125e-6229-4874-9428-a37f09abace3.png)
  • * 2.3 程序报异常:

    最终实体里的两个List均为空(count=0);
  • * 2.4 修复异常:

    XmlArrayAttribute + XmlArrayItemAttribute 在序列化具有外部容器元素的集合时应使用。当没有外部容器时,应使用 XmlElementAttribute;

    将实体List前面增加注解XmlElementAttribute,如下图: