从Web服务C#反序列化

时间:2014-03-24 08:46:05

标签: c# xml serialization

这是我的问题:我需要从Web服务获取资源列表,并将其反序列化为对象。但它不起作用,尽管我的代码使用另一个xml文件的事实。所以我无法弄清楚为什么它不起作用,我坚持了!

这是XML:

<ResourceDataSet xmlns="http://schemas.microsoft.com/office/project/server/webservices/ResourceDataSet/">
<Resources>
  <RES_UID>blabla</RES_UID>
  <RES_NAME>blabla</RES_NAME>
  <RES_CODE>blabla</RES_CODE>
  <RES_GROUP>blabla</RES_GROUP>
  <RES_COST_CENTER>blabla</RES_COST_CENTER>
</Resources>
<Resources>
  <RES_UID>blabla</RES_UID>
  <RES_NAME>blabla</RES_NAME>
  <RES_CODE>blabla</RES_CODE>
  <RES_GROUP>blabla</RES_GROUP>
  <RES_COST_CENTER>blabla</RES_COST_CENTER>
</Resources>
<Resources>
  <RES_UID>blabla</RES_UID>
  <RES_NAME>blabla</RES_NAME>
  <RES_CODE>blabla</RES_CODE>
  <RES_GROUP>blabla</RES_GROUP>
  <RES_COST_CENTER>blabla</RES_COST_CENTER>
</Resources>
</ResourceDataSet>

我想要反序列化的课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Threading.Tasks;
using System.Collections;

namespace TestWPF
{   
[Serializable()]
public class Employee
{
    [System.Xml.Serialization.XmlElement("RES_UID")]
    public int RES_UID { get; set; }

    [System.Xml.Serialization.XmlElement("RES_NAME")]
    public String RES_NAME { get; set; }

    [System.Xml.Serialization.XmlElement("RES_CODE")]
    public String RES_CODE { get; set; }

    [System.Xml.Serialization.XmlElement("RES_GROUP")]
    public String RES_GROUP { get; set; }

    [System.Xml.Serialization.XmlElement("RES_COST_CENTER")]
    public String RES_COST_CENTER { get; set; }

    public Employee()
    { }

    public Employee(int r_id, String res_name, String res_code, String res_group, String res_cost_center)
    {
        this.RES_UID = r_id;
        this.RES_NAME = res_name;
        this.RES_CODE = res_code;
        this.RES_GROUP = res_group;
        this.RES_COST_CENTER = res_cost_center;
    }
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("ResourceDataSet")]
public class EmployeeList //: IEnumerator, IEnumerable
{
    public EmployeeList() {Items = new List<Employee>();}
    [XmlArray("ResourceDataSet")]
    [XmlArrayItem("Resources")]
    public List<Employee> Items {get;set;}
}
}

我用来反序列化的代码:

EmployeeList lstEmployee = null;

XmlSerializer xs = new XmlSerializer(typeof(ServersList));

StreamReader sr = new StreamReader("testEmployee.xml");
lstEmployee = (EmployeeList)serializer.Deserialize(sr);
reader.Close();
for (int i = 0; i < lstEmployee.Items.Count(); i++)
{
    MessageBox.Show(lstEmployee.Items[i].RES_NAME);
}

当我尝试启动时,我收到此错误消息:

And when I try to launch I receive this error message :

2 个答案:

答案 0 :(得分:2)

首先你的xml文件是无效的 - RES_UID期望一个int,所以即使你的序列化工作,你也会遇到这个问题。

您还没有考虑名称空间。以下课程有效:

[Serializable()]
public class Employee
{
    [System.Xml.Serialization.XmlElement("RES_UID")]
    public int RES_UID { get; set; }

    [System.Xml.Serialization.XmlElement("RES_NAME")]
    public String RES_NAME { get; set; }

    [System.Xml.Serialization.XmlElement("RES_CODE")]
    public String RES_CODE { get; set; }

    [System.Xml.Serialization.XmlElement("RES_GROUP")]
    public String RES_GROUP { get; set; }

    [System.Xml.Serialization.XmlElement("RES_COST_CENTER")]
    public String RES_COST_CENTER { get; set; }

    public Employee()
    { }

    public Employee(int r_id, String res_name, String res_code, String res_group, String res_cost_center)
    {
        this.RES_UID = r_id;
        this.RES_NAME = res_name;
        this.RES_CODE = res_code;
        this.RES_GROUP = res_group;
        this.RES_COST_CENTER = res_cost_center;
    }
}

[Serializable()]
[System.Xml.Serialization.XmlRoot("ResourceDataSet", Namespace = "http://schemas.microsoft.com/office/project/server/webservices/ResourceDataSet/")]
public class EmployeeList //: IEnumerator, IEnumerable
{
    public EmployeeList() {Items = new List<Employee>();}

    [XmlElement("Resources", Type = typeof(Employee))]
    public List<Employee> Items {get;set;}
}
}

并修复了拼写错误的调用代码:

EmployeeList lstEmployee = null;

            XmlSerializer xs = new XmlSerializer(typeof(EmployeeList));

            StreamReader sr = new StreamReader("testEmployee.xml");
            lstEmployee = (EmployeeList)xs.Deserialize(sr);
            sr.Close();
            for (int i = 0; i < lstEmployee.Items.Count(); i++)
            {
                MessageBox.Show(lstEmployee.Items[i].RES_NAME);

            }

请记住将xml修复为int,否则它仍然无法正常工作

答案 1 :(得分:0)

您需要使用XmlRoot属性修饰根实体,或者在运行时反序列化时指定root属性。

以下是关于此问题的主题 https://stackoverflow.com/a/1557145/1305119