Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将XML反序列化到列表<;对象>;_C#_Xml_Asp.net Mvc_Asp.net Mvc 3_Wcf - Fatal编程技术网

C# 如何将XML反序列化到列表<;对象>;

C# 如何将XML反序列化到列表<;对象>;,c#,xml,asp.net-mvc,asp.net-mvc-3,wcf,C#,Xml,Asp.net Mvc,Asp.net Mvc 3,Wcf,我尝试创建返回值为XML的WCF。 当我尝试将xml文件反序列化为对象时,出现了错误 这是我用来反序列化文件的代码 我的控制器 //serialize request to wcf// var requestXML = Lib.Serializer.ObjectSerializer.Serialize(request); //get response from wcf// var XMLResult = Lib.Net.Http.Post(requestXML,"http://local

我尝试创建返回值为XML的WCF。 当我尝试将xml文件反序列化为对象时,出现了错误

这是我用来反序列化文件的代码

我的控制器

//serialize request to wcf//    
var requestXML = Lib.Serializer.ObjectSerializer.Serialize(request);
//get response from wcf//
var XMLResult = Lib.Net.Http.Post(requestXML,"http://localhost:53721/RoomRate.svc/RoomRates", 60);
//deserialize xml file to object//
var response = Lib.Serializer.ObjectSerializer.Deserialize<List<RoomRatesResponses>>(XMLResult);

以下是修复问题所需的伪代码。此处显示了序列化的工作方式,反序列化则相反,请注意类和变量名:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Xml.Serialization;

namespace Code.Without.IDE
{
    //http://stackoverflow.com/questions/20697928/how-to-deserialize-xml-to-listobject
    public class Dummy
    {
        private static void Main()
        {
            List<RoomRateResult> ArrayOfRoomRateResult = new List<RoomRateResult>();
            RoomRateResult rs1 = new RoomRateResult
                                        {
                                            ErrorMessage = string.Empty,
                                            OperationSuccess = true,
                                            Allotment = 10,
                                            Breakfast = true,
                                            CheckInDate = DateTime.Now,
                                            CloseSelling = false,
                                            CommissionPct = 3.0d,
                                            CurrCode = "USD",
                                            FreeSell = true,
                                            RoomRateId = 100,
                                            RoomType = "Mega",
                                            SingleRate = 95d,
                                            TripleRate = 150d,
                                            TwinDoubleRate = 150d
                                        };

            RoomRateResult rs2 = new RoomRateResult
                                        {
                                            ErrorMessage = string.Empty,
                                            OperationSuccess = true,
                                            Allotment = 12,
                                            Breakfast = true,
                                            CheckInDate = DateTime.Now,
                                            CloseSelling = false,
                                            CommissionPct = 2.0d,
                                            CurrCode = "USD",
                                            FreeSell = true,
                                            RoomRateId = 110,
                                            RoomType = "Mega",
                                            SingleRate = 90d,
                                            TripleRate = 140d,
                                            TwinDoubleRate = 150d
                                        };

            ArrayOfRoomRateResult.Add(rs1);
            ArrayOfRoomRateResult.Add(rs2);

            XmlSerializer ser = new XmlSerializer(typeof(List<RoomRateResult>));
            TextWriter writer = new StreamWriter("serl.xml");
            ser.Serialize(writer, ArrayOfRoomRateResult);
            writer.Flush();
            writer.Close();
        }
    }

    [Serializable]
    public class RoomRateResult
    {
        public string ErrorMessage { get; set; }
        public bool OperationSuccess { get; set; }
        public int Allotment { get; set; }
        public bool Breakfast { get; set; }
        public DateTime CheckInDate { get; set; }
        public bool CloseSelling { get; set; }
        public double CommissionPct { get; set; }
        public string CurrCode { get; set; }
        public bool FreeSell { get; set; }
        public int RoomRateId { get; set; }
        public string RoomType { get; set; }
        public double SingleRate { get; set; }
        public double TripleRate { get; set; }
        public double TwinDoubleRate { get; set; }
    }
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.IO;
使用系统线程;
使用System.Xml.Serialization;
名称空间代码.不带.IDE
{
//http://stackoverflow.com/questions/20697928/how-to-deserialize-xml-to-listobject
公共类虚拟
{
私有静态void Main()
{
List ArrayFroomRateResult=新列表();
RoomRateResult rs1=新RoomRateResult
{
ErrorMessage=string.Empty,
操作成功=真,
分配=10,
早餐=真的,
CheckInDate=DateTime。现在,
收盘价=假,
佣金PCT=3.0d,
CurrCode=“USD”,
FreeSell=true,
RoomRateId=100,
RoomType=“Mega”,
单速率=95d,
三倍率=150d,
双倍率=150d
};
RoomRateResult rs2=新RoomRateResult
{
ErrorMessage=string.Empty,
操作成功=真,
分配额=12,
早餐=真的,
CheckInDate=DateTime。现在,
收盘价=假,
佣金PCT=2.0d,
CurrCode=“USD”,
FreeSell=true,
RoomRateId=110,
RoomType=“Mega”,
单速率=90d,
三倍率=140d,
双倍率=150d
};
ArrayFroomRateResult.Add(rs1);
ArrayFroomRateResult.Add(rs2);
XmlSerializer ser=新的XmlSerializer(typeof(List));
TextWriter=newstreamwriter(“serl.xml”);
serial.Serialize(writer,arrayofroomratesult);
writer.Flush();
writer.Close();
}
}
[可序列化]
公开课成绩
{
公共字符串错误消息{get;set;}
公共布尔运算成功{get;set;}
公共整数分配{get;set;}
公共早餐{get;set;}
公共日期时间检查日期{get;set;}
公共bool closeseselling{get;set;}
公共双委托PCT{get;set;}
公共字符串CurrCode{get;set;}
公共布尔FreeSell{get;set;}
public int RoomRateId{get;set;}
公共字符串RoomType{get;set;}
公共双单速率{get;set;}
公共双三倍速率{get;set;}
公共双速率{get;set;}
}
}
序列化提供了:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfRoomRateResult xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <RoomRateResult>
    <ErrorMessage />
    <OperationSuccess>true</OperationSuccess>
    <Allotment>10</Allotment>
    <Breakfast>true</Breakfast>
    <CheckInDate>2013-12-19T23:11:08.2340815-08:00</CheckInDate>
    <CloseSelling>false</CloseSelling>
    <CommissionPct>3</CommissionPct>
    <CurrCode>USD</CurrCode>
    <FreeSell>true</FreeSell>
    <RoomRateId>100</RoomRateId>
    <RoomType>Mega</RoomType>
    <SingleRate>95</SingleRate>
    <TripleRate>150</TripleRate>
    <TwinDoubleRate>150</TwinDoubleRate>
  </RoomRateResult>
  <RoomRateResult>
    <ErrorMessage />
    <OperationSuccess>true</OperationSuccess>
    <Allotment>12</Allotment>
    <Breakfast>true</Breakfast>
    <CheckInDate>2013-12-19T23:11:08.2380815-08:00</CheckInDate>
    <CloseSelling>false</CloseSelling>
    <CommissionPct>2</CommissionPct>
    <CurrCode>USD</CurrCode>
    <FreeSell>true</FreeSell>
    <RoomRateId>110</RoomRateId>
    <RoomType>Mega</RoomType>
    <SingleRate>90</SingleRate>
    <TripleRate>140</TripleRate>
    <TwinDoubleRate>150</TwinDoubleRate>
  </RoomRateResult>
</ArrayOfRoomRateResult>

真的
10
真的
2013-12-19T23:11:08.2340815-08:00
假的
3.
美元
真的
100
巨大的
95
150
150
真的
12
真的
2013-12-19T23:11:08.2380815-08:00
假的
2.
美元
真的
110
巨大的
90
140
150

如果您不想像Abhinav建议的那样出于某种原因重命名您的类,您可以创建自己的列表,实现IXmlSerializable

[XmlRoot(ElementName = "ArrayOfRoomRateResult")]
public class MyList : List<RoomRateResponse>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        var serializer = new XmlSerializer(typeof(RoomRateResponse));
        var wasEmpty = reader.IsEmptyElement;
        reader.Read();
        if (wasEmpty)
            return;
        while (reader.NodeType != XmlNodeType.EndElement)
        {
            var item = (RoomRateResponse)serializer.Deserialize(reader);
            Add(item);
        }
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        var serializer = new XmlSerializer(typeof(RoomRateResponse));
        foreach (var val in this)
        {
            serializer.Serialize(writer, val);
        }
    }
}
[XmlRoot(ElementName = "RoomRateResult")]
public class RoomRateResponse
{
    //...
}
现在,您的序列化工作正常:

//...
var response = Lib.Serializer.ObjectSerializer.Deserialize<MyList>(xml);
/。。。
var response=Lib.Serializer.ObjectSerializer.Deserialize(xml);

您是否将该类从
RoomRateResult
重命名为
RoomRateResponse
?是的。。但是,仍然有相同的错误。列表的名称也不正确,它应该是
ArrayOfRoomRateResult
而不是
ListRoomRateResponse
。这个问题似乎离题了,因为它是由键入错误引起的-可能是由于在旧文件版本上进行测试,并且对SO用户没有未来的好处。你能给我举个例子吗,我必须重命名哪个部分才能解决我的问题?谢谢
[XmlRoot(ElementName = "ArrayOfRoomRateResult")]
public class MyList : List<RoomRateResponse>, IXmlSerializable
{
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        var serializer = new XmlSerializer(typeof(RoomRateResponse));
        var wasEmpty = reader.IsEmptyElement;
        reader.Read();
        if (wasEmpty)
            return;
        while (reader.NodeType != XmlNodeType.EndElement)
        {
            var item = (RoomRateResponse)serializer.Deserialize(reader);
            Add(item);
        }
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        var serializer = new XmlSerializer(typeof(RoomRateResponse));
        foreach (var val in this)
        {
            serializer.Serialize(writer, val);
        }
    }
}
[XmlRoot(ElementName = "RoomRateResult")]
public class RoomRateResponse
{
    //...
}
//...
var response = Lib.Serializer.ObjectSerializer.Deserialize<MyList>(xml);