首页 > 解决方案 > 嵌套数据的序列化失败

问题描述

Visual Studio 创建的自动生成的 WCF 类没有为我正在使用的端点正确反序列化 SOAP 响应。

对于肯定返回给服务的对象,它返回 null。

这是从生成的类wsdl

 public partial class OrderDepartureLoadRail : object, System.ComponentModel.INotifyPropertyChanged {
        
        private string request_NumberField;
        
        private string agreement_NumberField;
        
        private System.DateTime agreement_DataField;
        
        private System.DateTime eTD_StartField;
        
        private System.DateTime eTD_EndField;
        
        private OrderDepartureLoadRailCONTAINERS cONTAINERSField;
        
        private cargo[] cARGOSField;
        
        private contractor[] cONTRACTORSField;
        
        private string station_Code_ToField;
        
        private string port_Code_ToField;
        
        private string commentField;
        
        private contact contactPersonField;
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace="http://objects.common.exchange.terminal.service.cyberlines", Order=0)]
        public string Request_Number {
            get {
                return this.request_NumberField;
            }
            set {
                this.request_NumberField = value;
                this.RaisePropertyChanged("Request_Number");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace="http://objects.common.exchange.terminal.service.cyberlines", Order=1)]
        public string Agreement_Number {
            get {
                return this.agreement_NumberField;
            }
            set {
                this.agreement_NumberField = value;
                this.RaisePropertyChanged("Agreement_Number");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace="http://objects.common.exchange.terminal.service.cyberlines", Order=2)]
        public System.DateTime Agreement_Data {
            get {
                return this.agreement_DataField;
            }
            set {
                this.agreement_DataField = value;
                this.RaisePropertyChanged("Agreement_Data");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace="http://objects.common.exchange.terminal.service.cyberlines", Order=3)]
        public System.DateTime ETD_Start {
            get {
                return this.eTD_StartField;
            }
            set {
                this.eTD_StartField = value;
                this.RaisePropertyChanged("ETD_Start");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Namespace="http://objects.common.exchange.terminal.service.cyberlines", Order=4)]
        public System.DateTime ETD_End {
            get {
                return this.eTD_EndField;
            }
            set {
                this.eTD_EndField = value;
                this.RaisePropertyChanged("ETD_End");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=5)]
        public OrderDepartureLoadRailCONTAINERS CONTAINERS {
            get {
                return this.cONTAINERSField;
            }
            set {
                this.cONTAINERSField = value;
                this.RaisePropertyChanged("CONTAINERS");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=6)]
        [System.Xml.Serialization.XmlArrayItemAttribute("Cargo", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
        public cargo[] CARGOS {
            get {
                return this.cARGOSField;
            }
            set {
                this.cARGOSField = value;
                this.RaisePropertyChanged("CARGOS");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=7)]
        [System.Xml.Serialization.XmlArrayItemAttribute("Contractor", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
        public contractor[] CONTRACTORS {
            get {
                return this.cONTRACTORSField;
            }
            set {
                this.cONTRACTORSField = value;
                this.RaisePropertyChanged("CONTRACTORS");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="token", Order=8)]
        public string Station_Code_To {
            get {
                return this.station_Code_ToField;
            }
            set {
                this.station_Code_ToField = value;
                this.RaisePropertyChanged("Station_Code_To");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="token", Order=9)]
        public string Port_Code_To {
            get {
                return this.port_Code_ToField;
            }
            set {
                this.port_Code_ToField = value;
                this.RaisePropertyChanged("Port_Code_To");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=10)]
        public string Comment {
            get {
                return this.commentField;
            }
            set {
                this.commentField = value;
                this.RaisePropertyChanged("Comment");
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=11)]
        public contact ContactPerson {
            get {
                return this.contactPersonField;
            }
            set {
                this.contactPersonField = value;
                this.RaisePropertyChanged("ContactPerson");
            }
        }
        
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        
        protected void RaisePropertyChanged(string propertyName) {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if ((propertyChanged != null)) {
                propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
            }
        }
    }

web api xml以格式传输到文档时

<OrderDepartureLoadRail> 
    <Request_Number>1128606</Request_Number>
    <Agreement_Number>ВЖЭ-13/492</Agreement_Number> 
    <Agreement_Data>2013-11-19T00:00:00</Agreement_Data> 
    <ETD_Start>2020-09-28T00:00:00</ETD_Start>
    <ETD_End>2020-09-28T23:59:59</ETD_End>
    <CONTAINERS>
        <Container>
            <ContNumber>TCNU802</ContNumber>
            <ContQuantity>1</ContQuantity>
            <ContType>40HC</ContType>
            <ContOwner>COC</ContOwner>
            <Weight>180</Weight>
            <Tare>41</Tare>
        </Container>
    <SEALS>
        <seal>
            <Seals_Number>У965</Seals_Number>
        </seal>
    </SEALS>
    </CONTAINERS>
    <CARGOS>
        <cargo>
            <ETSNG>263</ETSNG>
            <NumberOfSeats>20</NumberOfSeats>
            <Pack>BG</Pack>
            <Weight>180</Weight>
            <Guard>false</Guard>
            <Danger>false</Danger>
            <OrderNo>1</OrderNo>
        </cargo>
    </CARGOS>
    <CONTRACTORS>
        <contractor>
            <Contractor_Type>SH</Contractor_Type>
            <Name>ПАО </Name>
            <OKPO>01126016</OKPO>
            <SendersMarks>Получ </SendersMarks>
            <Comment>После</Comment>
        </contractor>
    </CONTRACTORS>
    <Station_Code_To>9807</Station_Code_To>
    <Port_Code_To>Кор</Port_Code_To>
    <Comment />
    <ContactPerson>
        <FIO>Хузе</FIO>
        <Phone>+79454</Phone>
        <Mail>KKh@ya.ru</Mail>
    </ContactPerson>
</OrderDepartureLoadRail>

忽略顺序并返回null(data = null)

        [HttpPost]
        [Route("PostCreateOrderDepartureLoadRail")]
        public OrderResponse PostCreateOrderDepartureLoadRail(OrderDepartureLoadRail data)
        {
...
}

在这里他们描述了一个类似的错误,但他们没有找到解决方案 github-solution

标签: c#asp.net

解决方案


我设法使用第三方库 YAXLib 解决了这个问题

https://github.com/sinairv/YAXLib


推荐阅读