2014-01-14 3 views
0

У меня возникла проблема десериализации ответа Rest XML в свой объект. Если я сериализую контракт с данными, ожидаемый в потребительском приложении, форматирование XML немного отличается от того, что на самом деле получено из службы Rest. Класс контракта данных, который отправляется из службы, точно такой же, как тот, который я ожидаю. Если я изменю XML, полученный от службы Rest, на ответ, ожидаемый потребительским приложением, все будет работать.Deserializing XML From Rest service

Ответ, который я получаю от службы 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\">

служба Rest посылает <GeneralInquiryResponseCollection xmlns=\"http://schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">

  1. Потребитель ожидает, что свойства нулевого значения не имеет тег в XML, но служба Rest отправляет тег я: ноль = \ "истинным \".

Код, десериализующийся, находится ниже, где T является генераторным запросомResponseCollection.

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 
    } 
} 

Ive борется с этим на некоторое время, и Im удара тупиков. Какие-либо предложения?

ответ

2

Это означает, что ResultCode является нулевым

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

Это означает, что ResultCode = ""

<ResultCode /> 

Если вы не просто запрашивая о нолю, то пожалуйста, объясните более подробно. Это просто свойство nillable, определенное как таковое в схеме.

Чтобы удалить пространство имен:

[DataContract(Namespace = "")] 
+0

Виджай, я пытаюсь выяснить, почему одна программа сериализации с , а другой нет. Как я могу управлять xmlns: xsi = \ "http: //www.w3.org/2001/XMLSchema-instance \", который сериализуется против xmlns = \ "http://schemas.datacontract.org/2004/07 /MEA.SmartApp.AdminGateway.ServiceContract.Responses \ "? – GWines

+0

@RichardSchneider поставил способ контролировать сериализацию в вашей модели. Если это не твоя модель, я боюсь, что ты мало что можешь сделать. – Faraday

+0

@GWines - Не могли бы вы разместить свои файлы определения службы? – Faraday

0

Вы можете использовать метод "ShouldSerializeXXX" в модели данных. Смотрите это MSDN article

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

Для контрактов данных можно использовать [DataMember(EmitDefaultValue = false)] атрибут вместо добавления метода.См. Data members default values.

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

Ричард, этот атрибут свойства помогает с проблемой i = nil \ "true \", но он не разрешает большую проблему атрибута xmlns: http://www.w3.org/2001/XMLSchema-instance и http : //schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses на противоположных сторонах сервиса. – GWines

+0

Почему вы заботитесь о xmlns. Его просто пространство имен XML ... это ничего не болит. –

+0

Мне просто нужно, чтобы десериализовать XML, отправленный службой в моем потребительском приложении. Я догадываюсь, почему это не будет. Мне был предоставлен XSD от разработчика сервиса, и я создал файл cs с помощью xsd.exe. Все компилируется, но я получаю сообщение об ошибке: {«В документе XML есть ошибка (1, 2).»}, Когда я использую XmlSerializer для десериализации в объект GeneralInquiryResponseCollection. – GWines