You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bargain Finder Max API:XmlSerializer序列化ItemChoiceType枚举值输出错误

序列化XML时ItemChoiceType枚举映射错误问题

我使用Microsoft.Tools.ServiceModel.Svcutil生成的C#类,通过System.Xml.Serialization.XmlSerializer将对象序列化为XML。生成的类包含ItemChoiceType枚举,以及用于指定要序列化的XML元素的ItemElementName属性。但设置ItemElementName为DepartureDateTime时,实际输出的却是ArrivalDateTime元素,以下是相关信息:

生成的相关代码

[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.2.0-preview1.23462.5")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.opentravel.org/OTA/2003/05", IncludeInSchema=false)]
public enum ItemChoiceType
{
    DepartureDateTime,
    ArrivalDateTime,
    ArrivalDates,
    DepartureDates,
}

[System.Xml.Serialization.XmlElementAttribute(Order=1)]
[System.Xml.Serialization.XmlIgnoreAttribute()]
public ItemChoiceType ItemElementName
{
    get
    {
        return this.itemElementNameField;
    }
    set
    {
        this.itemElementNameField = value;
    }
}

[System.Xml.Serialization.XmlElementAttribute("ArrivalDateTime", typeof(string), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("ArrivalDates", typeof(TravelDateTimeTypeArrivalDates), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("DepartureDateTime", typeof(string), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("DepartureDates", typeof(TravelDateTimeTypeDepartureDates), Order=0)]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
public object Item
{
    get
    {
        return this.itemField;
    }
    set
    {
        this.itemField = value;
    }
}

对象初始化代码

ota_AirLowFareSearchRQ.OriginDestinationInformation[0] = new OTA_AirLowFareSearchRQOriginDestinationInformation()
{
    RPH = "1",
    Item = model.DepartureDate.Value.ToString("yyyy-MM-ddTHH:mm:ss"),
    ItemElementName = ItemChoiceType.DepartureDateTime, // 期望序列化该元素
    OriginLocation = new OriginDestinationInformationTypeOriginLocation()
    {
        LocationCode = model.DepartureFrom
    },
    DestinationLocation = new OriginDestinationInformationTypeDestinationLocation()
    {
        LocationCode = model.ArrivalTo
    },
};

错误的XML输出

<OriginDestinationInformation RPH="1" xmlns="http://www.opentravel.org/OTA/2003/05">
    <ArrivalDateTime>2024-08-04T00:00:00</ArrivalDateTime>
    <OriginLocation LocationCode="MAA" />
    <DestinationLocation LocationCode="KTM" />
</OriginDestinationInformation>

问题原因

核心问题是**ItemChoiceType枚举的成员顺序与Item属性上的XmlElementAttribute标注顺序不匹配**。

XmlSerializer处理XmlChoiceIdentifierAttribute时,是通过枚举成员的索引位置来匹配对应的XmlElementAttribute,而不是根据枚举成员名称。具体来说:

  • ItemChoiceType.DepartureDateTime是枚举的第0个成员(索引0)
  • 但Item属性上的第一个XmlElementAttribute是ArrivalDateTime,所以序列化时会匹配这个属性对应的元素,导致输出错误。

解决方法

调整Item属性上的XmlElementAttribute顺序,使其与ItemChoiceType枚举的成员顺序完全一致:

[System.Xml.Serialization.XmlElementAttribute("DepartureDateTime", typeof(string), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("ArrivalDateTime", typeof(string), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("ArrivalDates", typeof(TravelDateTimeTypeArrivalDates), Order=0)]
[System.Xml.Serialization.XmlElementAttribute("DepartureDates", typeof(TravelDateTimeTypeDepartureDates), Order=0)]
[System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
public object Item
{
    get { return this.itemField; }
    set { this.itemField = value; }
}

或者反过来调整ItemChoiceType枚举的成员顺序,使其与XmlElementAttribute的顺序对应,两种方式都可以解决映射错误的问题。

内容的提问来源于stack exchange,提问作者Rohitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:07:31