C# 如何将XML反序列化到列表<;对象>;
我尝试创建返回值为XML的WCF。 当我尝试将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
//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);