【问题标题】:How to deserialize XML file into a list of objects如何将 XML 文件反序列化为对象列表
【发布时间】:2015-04-09 04:41:48
【问题描述】:

我需要帮助,我有一个 XML 文件,我已经在一个名为 Class 1 的类上序列化了该文件,其中包含另一个名为“服务”的类类型的列表 将列表序列化为 XML 文件后,我试图将文件反序列化回服务类型列表

这是 1 类代码:

public class Class1

{
    public Class1()
    {
        ServiceList = new List<service>();

    }
    public List<service> ServiceList { get; set; }
}

public class service
{
    public string ServiceName { get; set; }
    public string Symbol { get; set; }

}

这是我的序列化代码:

 var filestream = new FileStream("sth.xml", FileMode.Create);
        new XmlSerializer(typeof(Class1)).Serialize(filestream,c);
        filestream.Close(); 

这是 XML 数据:

<?xml version="1.0"?>
<Class1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ServiceList>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
<service>
  <ServiceName>cool</ServiceName>
  <Symbol>v</Symbol>
</service>
 </ServiceList>
</Class1>   

这是我的反序列化代码,它运行正常但没有给我正确的输出

        XmlSerializer myDeserilizer = new XmlSerializer(typeof(List<service>) ,  new XmlRootAttribute("Class1"));
        FileStream myfilestream = new FileStream("sth.xml", FileMode.Open);
        var loadedData = (List<service>)myDeserilizer.Deserialize(myfilestream);
        myfilestream.Close();  

问题是在 DE 序列化后没有得到列表 有什么帮助吗??

【问题讨论】:

  • 你试过 new XmlSerializer(typeof(Class1)) 吗?它应该工作
  • @Peyman 你的意思是在序列化代码中?
  • 反序列化代码中没有,XmlSerializer myDeserilizer = new XmlSerializer(typeof(Class1))
  • @Peyman 我试过了,它给了我这个错误:无法将“WindowsFormsApplication4.Class1”类型的对象转换为“System.Collections.Generic.List`1[WindowsFormsApplication4.service]”。
  • 试试我的答案,它应该可以工作

标签: c# asp.net xml serialization deserialization


【解决方案1】:

如下重写代码并查看结果:

[XmlRoot(ElementName = "Class1"), XmlType("Class1")]
public class Class1
{
  public Class1()
  {
     ServiceList = new List<service>();

  }
  [XmlElement(ElementName = "ServiceList")
  public List<service> ServiceList { get; set; }
}

[XmlRoot(ElementName = "Service"), XmlType("Service")]
public class service
{
   [XmlElement(ElementName = "ServiceName")
   public string ServiceName { get; set; }

   [XmlElement(ElementName = "Symbol")
   public string Symbol { get; set; }
}

然后改变你的反序列化代码如下:

XmlSerializer myDeserilizer = new XmlSerializer(typeof(Class1));
FileStream myfilestream = new FileStream("sth.xml", FileMode.Open);
var loadedData = myDeserilizer.Deserialize(myfilestream);
myfilestream.Close();  

它应该可以工作,我在本地测试过

【讨论】:

    【解决方案2】:

    你的反序列化过去有问题,你可以简单地改变你的反序列化部分如下。

            XmlSerializer myDeserilizer = new XmlSerializer(typeof(Class1));
            FileStream myfilestream = new FileStream("sth.xml", FileMode.Open);
            var loadedData = (Class1)myDeserilizer.Deserialize(myfilestream);
            var listOfServices = loadedData.ServiceList;
            myfilestream.Close();
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2017-08-20
      • 2021-05-03
      • 1970-01-01
      • 2020-05-10
      相关资源
      最近更新 更多