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
相关产品推荐
相关产品推荐

