为什么 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 架构文件生成的 类。