2

次のようなXML文字列があります

<?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ます。私は何を逃したのですか?

4

1 に答える 1

2

これは、FullServiceAddressCorrectionDelivery1クラス(内部のFullServiceAddressCorrectionDelivery)にSubmitingSoftware要素の定義が含まれていないが、XMLにはそれが含まれているためです。その場合、XMLデシリアライザーはSubmitingSoftwareの前にプロパティを読み取ることができますが、SubmitingSoftwareの後のすべてのプロパティはnullに設定されているようです。私は、WebサービスからXMLを逆シリアル化する際にこれを自分で経験しました。

通常、これは、Webサービスのバージョン1を使用してクライアントを作成してから、データコントラクトにもう1つのプロパティを持つWebサービスのバージョン2を作成した場合に発生します。このような場合、新しいプロパティがXMLの最後(下部)に配置されていることを確認する必要があります。

于 2012-06-05T10:33:18.403 に答える