2012-06-05 2 views
2

У меня есть XML-строку, какWCF с XmlSerializer

<?xml version="1.0"?> 
<FullServiceAddressCorrectionDelivery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <AuthenticationInfo xmlns="http://www.usps.com/postalone/services/UserAuthenticationSchema"> 
    <UserId xmlns="">FAPushService</UserId> 
    <UserPassword xmlns="">Password4Now</UserPassword> 
    </AuthenticationInfo> 
    <FullServiceAddressCorrectionDelivery d2p1:MessageGroupID="3599" d2p1:TotalMessageCount="1" d2p1:MessageSerialNumber="1" xmlns:d2p1="http://idealliance.org/Specs/mailxml10.0/mailxml_defs" xmlns="http://idealliance.org/Specs/mailxml10.0A/mailxml_dd"> 
    <SubmittingParty d2p1:MaildatUserLicense="USPS" /> 
    <SubmittingSoftware d2p1:SoftwareName="PostalOne" d2p1:Vendor="USPS" d2p1:Version="27.0" /> 
    <PushMessageID>3599001</PushMessageID> 
    </FullServiceAddressCorrectionDelivery> 
</FullServiceAddressCorrectionDelivery> 

и контракт на обслуживание, как

[ServiceContract(Namespace = http://www.usps.com/postalone/services/DataDistributionPushMailXML10A")] 
public interface DataDistributionPushMailXML10APortType 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    FullServiceAddressCorrectionDelivery PushFullServiceAddressCorrectionDelivery(FullServiceAddressCorrectionDelivery obj); 
} 

// Use a data contract as illustrated in the sample below to add composite types to service operations. 
[DataContract(Name = "FullServiceAddressCorrectionDelivery", Namespace = "http://www.w3.org/2001/XMLSchema-instance")] 
[Serializable] 
public class FullServiceAddressCorrectionDelivery 
{ 
    [XmlElement("AuthenticationInfo", 
    Namespace = "http://www.usps.com/postalone/services/UserAuthenticationSchema")] 
    [DataMember] 
    public AuthenticationInfoType AuthenticationInfo 
    { 
     get; 
     set; 
    } 

    [XmlElement("FullServiceAddressCorrectionDelivery", 
    Namespace = "http://idealliance.org/Specs/mailxml10.0A/mailxml_dd")] 
    [DataMember] 
    public FullServiceAddressCorrectionDelivery1 FullServiceAddressCorrectionDelivery1 
    { 
     get; 
     set; 
    } 
} 

[DataContract] 
[Serializable] 
public class AuthenticationInfoType 
{ 
    [DataMember] 
    [XmlElement("UserId", Namespace = "")] 
    public string UserId 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    [XmlElement("UserPassword", Namespace = "")] 

    public string UserPassword 
    { 
     get; 
     set; 
    } 
} 

[DataContract] 
[Serializable] 
public class ParticipantIDType 
{ 
    private string _maildatUserLicense; 

    [DataMember] 
    [XmlAttribute("MaildatUserLicense", 
    Namespace ="http://idealliance.org/Specs/mailxml10.0/mailxml_defs")] 
    public string MaildatUserLicense 
    { 
     get 
     { 
      return this._maildatUserLicense; 
     } 
     set 
     { 
      this._maildatUserLicense = value; 
     } 
    } 
} 

[DataContract] 
[Serializable] 
public class FullServiceAddressCorrectionDelivery1 
{ 
    [DataMember] 
    [XmlElement("SubmittingParty")] 
    public ParticipantIDType SubmittingParty 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    [XmlElement("PushMessageID")] 
    public string PushMessageID 
    { 
     get; 
     set; 

    } 
} 

На десериализации, я использую XmlSerializer:

FullServiceAddressCorrectionDelivery objAddressCorrectionDelivery = 
    new FullServiceAddressCorrectionDelivery(); 
byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(this.richTextBox1.Text); 
MemoryStream stream = new MemoryStream(byteArray); 
XmlSerializer Xs = new XmlSerializer(typeof(FullServiceAddressCorrectionDelivery)); 
var result = (FullServiceAddressCorrectionDelivery)Xs.Deserialize(stream); 

Проблема при десериализации: мой FullServiceAddressCorrectionDelivery Объект успешно десериализуется, но содержит null в своей собственности PushMessageID. Что я пропустил?

ответ

2

Причина этого заключается в том, что ваш класс FullServiceAddressCorrectionDelivery1 (внутренний FullServiceAddressCorrectionDelivery) не содержит определения элемента SubmittingSoftware, но XML содержит его. Что-то похожее на то, что десериализатор XML может читать свойства до SubmittingSoftware, но все свойства после SubmittingSoftware равны нулю. Я сам испытал это в десериализации XML из веб-сервисов.

Обычно это происходит, если вы создаете клиента, используя версию 1 вашего веб-сервиса, а затем создаете версию 2 вашего веб-сервиса, имея еще одно свойство в своем datacontract. В этих случаях вам необходимо убедиться, что новое свойство помещено последним (внизу) в вашем XML.

+0

спасибо и так много GTG! .. и разобрался с точной проблемой .. это делается изящно сейчас .. :) – Hassam

Смежные вопросы