簡體   English   中英

從Rest服務反序列化XML

[英]Deserializing XML From Rest service

我無法將Rest XML響應反序列化到其對象中。 如果我序列化我在消費者應用程序中期望的數據協定,則XML格式與實際從Rest服務接收的格式略有不同。 從服務發送的數據協定類與我期望的完全相同。 如果我將從Rest服務收到的XML更改為消費者應用程序所期望的響應,那么一切正常。

我從Rest服務收到的回復如下。

<GeneralInquiryResponseCollection xmlns=\"http://schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">
  <ResultCode i:nil=\"true\"/>
  <ResultCodeDescription i:nil=\"true\"/>
  <ResultInfoDescription i:nil=\"true\"/>
  <ErrorMessage/>
  <IsSuccess>true</IsSuccess>
  <TransactionStatus>
    <Description>Transaction Successful</Description>
    <StatusCode>2000</StatusCode>
  </TransactionStatus>
  <AsOfDate>9999-12-31T00:00:00</AsOfDate>
  <FunctionalGroupingCode>302</FunctionalGroupingCode>
  <GeneralInquiryResponseContainer>
  </GeneralInquiryResponseContainer>
  <LastWMAValuationDate>0001-01-01T00:00:00</LastWMAValuationDate>
  <PolicyNumber>551372461</PolicyNumber>
  <TransactionExecutionDateTime>2014-01-14T15:05:05.859558</TransactionExecutionDateTime>
</GeneralInquiryResponseCollection>

我從預期數據合同序列化時獲得的XML如下所示。

<?xml version=\"1.0\"?>
<GeneralInquiryResponseCollection xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
  <ResultCode />
  <ResultCodeDescription>Success</ResultCodeDescription>
  <ResultInfoDescription>Result Info Description</ResultInfoDescription>
  <IsSuccess>true</IsSuccess>
  <TransactionStatus>
    <Description>Transaction Successful</Description>
    <StatusCode>2000</StatusCode>
    <HTTPStatusCode>OK</HTTPStatusCode>
  </TransactionStatus>
  <StatusCode>2000</StatusCode>
  <AsOfDate>9999-12-31T23:59:59.9999999</AsOfDate>
  <FunctionalGroupingCode>302</FunctionalGroupingCode>
  <LastWMAValuationDate>0001-01-01T00:00:00</LastWMAValuationDate>
  <PolicyNumber>551372461</PolicyNumber>
  <TransactionExecutionDateTime>2014-01-14T14:40:59.0930535-07:00</TransactionExecutionDateTime>
</GeneralInquiryResponseCollection>

它們之間的主要區別如下。

  1. 消費者期望 - <?xml version=\\"1.0\\"?> - 但Rest服務不會發送此消息。

  2. 消費者期望 - <GeneralInquiryResponseCollection xmlns:xsi=\\"http://www.w3.org/2001/XMLSchema-instance\\" xmlns:xsd=\\"http://www.w3.org/2001/XMLSchema\\">

休息服務發送<GeneralInquiryResponseCollection xmlns=\\"http://schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses\\" xmlns:i=\\"http://www.w3.org/2001/XMLSchema-instance\\">

  1. 消費者期望null值的屬性在XML中沒有標記,但Rest服務使用i:nil = \\“true \\”發送標記。

反序列化的代碼低於T是GeneralInquiryResponseCollection的地方。

using (var ResponseStream = Response.GetResponseStream())
{
    XmlSerializer Serializer = new XmlSerializer(typeof(T));
    return (T)Serializer.Deserialize(ResponseStream);
}

以下是服務合同

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using MEA.SmartApp.AdminGateway.Interfaces;

namespace MEA.SmartApp.AdminGateway.ServiceContract.Responses
{
    [DataContract]
    public class GeneralInquiryResponseCollection : WMAResponse, IWMAResponse
    {

        #region Data Members

        [DataMember]
        public DateTime AsOfDate { get; set; }

        [DataMember]
        public string FunctionalGroupingCode { get; set; }

        [DataMember]
        public List<GeneralInquiryResponse> GeneralInquiryResponseContainer { get; set; }

        [DataMember]
        public DateTime LastWMAValuationDate { get; set; }

        [DataMember]
        public string PolicyNumber { get; set; }

        [DataMember]
        public DateTime? TransactionExecutionDateTime { get; set; }

        #endregion
    }
}

GeneralInquiryResponse

using System;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using MEA.SmartApp.AdminGateway.Interfaces;

namespace MEA.SmartApp.AdminGateway.ServiceContract.Responses
{
    [DataContract(Namespace = "")]
    [XmlInclude(typeof(ClientResponse))]
    [XmlInclude(typeof(ClientRoleResponse))]
    [XmlInclude(typeof(DCAFundResponse))]
    [XmlInclude(typeof(DCAResponse))]
    [XmlInclude(typeof(GMABResponse))]
    [XmlInclude(typeof(GMDBResponse))]
    [XmlInclude(typeof(GMIBResponse))]
    [XmlInclude(typeof(GWBResponse))]
    [XmlInclude(typeof(InterestRateResponse))]
    [XmlInclude(typeof(MoneyFundSegmentResponse))]
    [XmlInclude(typeof(MRDFundResponse))]
    [XmlInclude(typeof(PayoutFundResponse))]
    [XmlInclude(typeof(PayoutResponse))]
    [XmlInclude(typeof(PolicyFundResponse))]
    [XmlInclude(typeof(PolicyResponse))]
    [XmlInclude(typeof(PremiumBonusTransactionHistoryResponse))]
    [XmlInclude(typeof(ProducerGroupSegmentResponse))]
    [XmlInclude(typeof(RebalancingResponse))]
    [XmlInclude(typeof(RebalancingScheduledFundResponse))]
    [XmlInclude(typeof(RebalancingUnscheduledFundResponse))]
    [XmlInclude(typeof(WithdrawalGrossTransactionHistoryResponse))]
    [XmlInclude(typeof(WithdrawalSurrenderTransactionHistoryResponse))]
    public abstract class GeneralInquiryResponse : IGeneralInquiryResponse
    {
        #region Data Members

        [DataMember]
        public string ResponseIdentifier { get; set; }

        #endregion
    }
}

我一直在努力與這一個,我打死角。 有什么建議么?

這意味着ResultCode為null

<ResultCode i:nil=\"true\"/>

這意味着ResultCode =“”

<ResultCode />

如果您不只是詢問nil,請詳細解釋。 它只是一個nillable屬性,在模式中定義。

要刪除命名空間:

[DataContract(Namespace = "")]

您可以在數據模型中使用“ShouldSerializeXXX”方法。 請參閱此MSDN文章

public bool ShouldSerializeResultCode() 
{
   return ResultCode != null;
}

對於數據協定,您可以使用[DataMember(EmitDefaultValue = false)]屬性而不是添加方法。 請參見數據成員默認值

[DataMember(EmitDefaultValue = false)]
public string ResultCode { get; set; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM