为什么 Xml 序列化程序在序列化时会跳过某些属性以及如何避免它?
Why dose Xml Serializer skip certain attributes when serializing and how to avoid it?
我已经使用 xsd 工具从这些 XSDs 生成了 类。但是在请求 api 之后,响应消息说我没有发送属性 flexibleAllocation,而我明明已经发送了。
序列化程序一定有问题,但它没有抛出任何异常。
我就是这样完成的:
public AvailRateUpdateRS AvailRateUpdate()
{
var refDate = DateTime.Now;
var requestObject = new AvailRateUpdateRQ()
{
Authentication =
new AvailRateUpdateRQAuthentication()
{
username = "SomeUsername",
password = "SomePassword"
},
Hotel = new AvailRateUpdateRQHotel()
{
id = 12333123
},
Items = new[] {
new AvailRateUpdateRQAvailRateUpdate
{
DateRange = new DateRangeType[]{
new DateRangeType{
from = refDate,
to = refDate
}
},
RoomType = new RoomTypeType[]{
new RoomTypeType{
id = "123313",
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
}
}
}
}
}
};
var httpRequest = HttpWebRequest.Create("https://services.expediapartnercentral.com/eqc/ar");
httpRequest.Method = "POST";
httpRequest.ContentType = "text/xml";
var requestXml = new XmlDocument();
using (var requestStream = httpRequest.GetRequestStream())
{
var serializer = new XmlSerializer(typeof(AvailRateUpdateRQ));
serializer.Serialize(requestStream, requestObject);
requestXml.Save(requestStream);
}
using (var response = (HttpWebResponse)httpRequest.GetResponse())
using (var responseStream = response.GetResponseStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(AvailRateUpdateRS));
AvailRateUpdateRS deserialized = (AvailRateUpdateRS)serializer.Deserialize(responseStream);
return deserialized;
}
}
为什么在序列化时跳过 flexibleAllocation 属性?
序列化消息:
<?xml version="1.0" encoding="utf-8"?>
<AvailRateUpdateRQ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.expediaconnect.com/EQC/AR/2011/06">
<Authentication username="SomeUsername" password="SomePassword" />
<Hotel id="12333123" />
<AvailRateUpdate>
<DateRange from="2018-03-07" to="2018-03-07" />
<RoomType id="123313">
<Inventory />
</RoomType>
</AvailRateUpdate>
</AvailRateUpdateRQ>
顺便说一句 类(AvailRateUpdateRQ 和其他)是使用 xsd 工具从 xsd 文件生成的,并且没有以任何其他方式修改。
因为这些属性是可选的,如果没有明确指定将不会被序列化。
示例: 而这个
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
}
将被序列化为 <Inventory />
,但会像这样添加额外的属性
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
flexibleAllocationSpecified = true
}
将导致想要的序列化行为 <Inventory flexibleAllocation="3" />
这适用于从 Expedia API 架构文件生成的 类。
我已经使用 xsd 工具从这些 XSDs 生成了 类。但是在请求 api 之后,响应消息说我没有发送属性 flexibleAllocation,而我明明已经发送了。
序列化程序一定有问题,但它没有抛出任何异常。
我就是这样完成的:
public AvailRateUpdateRS AvailRateUpdate()
{
var refDate = DateTime.Now;
var requestObject = new AvailRateUpdateRQ()
{
Authentication =
new AvailRateUpdateRQAuthentication()
{
username = "SomeUsername",
password = "SomePassword"
},
Hotel = new AvailRateUpdateRQHotel()
{
id = 12333123
},
Items = new[] {
new AvailRateUpdateRQAvailRateUpdate
{
DateRange = new DateRangeType[]{
new DateRangeType{
from = refDate,
to = refDate
}
},
RoomType = new RoomTypeType[]{
new RoomTypeType{
id = "123313",
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
}
}
}
}
}
};
var httpRequest = HttpWebRequest.Create("https://services.expediapartnercentral.com/eqc/ar");
httpRequest.Method = "POST";
httpRequest.ContentType = "text/xml";
var requestXml = new XmlDocument();
using (var requestStream = httpRequest.GetRequestStream())
{
var serializer = new XmlSerializer(typeof(AvailRateUpdateRQ));
serializer.Serialize(requestStream, requestObject);
requestXml.Save(requestStream);
}
using (var response = (HttpWebResponse)httpRequest.GetResponse())
using (var responseStream = response.GetResponseStream())
{
XmlSerializer serializer = new XmlSerializer(typeof(AvailRateUpdateRS));
AvailRateUpdateRS deserialized = (AvailRateUpdateRS)serializer.Deserialize(responseStream);
return deserialized;
}
}
为什么在序列化时跳过 flexibleAllocation 属性?
序列化消息:
<?xml version="1.0" encoding="utf-8"?>
<AvailRateUpdateRQ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.expediaconnect.com/EQC/AR/2011/06">
<Authentication username="SomeUsername" password="SomePassword" />
<Hotel id="12333123" />
<AvailRateUpdate>
<DateRange from="2018-03-07" to="2018-03-07" />
<RoomType id="123313">
<Inventory />
</RoomType>
</AvailRateUpdate>
</AvailRateUpdateRQ>
顺便说一句 类(AvailRateUpdateRQ 和其他)是使用 xsd 工具从 xsd 文件生成的,并且没有以任何其他方式修改。
因为这些属性是可选的,如果没有明确指定将不会被序列化。
示例: 而这个
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
}
将被序列化为 <Inventory />
,但会像这样添加额外的属性
Inventory = new RoomTypeTypeInventory{
flexibleAllocation = 3,
flexibleAllocationSpecified = true
}
将导致想要的序列化行为 <Inventory flexibleAllocation="3" />
这适用于从 Expedia API 架构文件生成的 类。