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对象已成功反序列化,但其PushMessageID属性中包含 null。我错过了什么?

4

1 回答 1

2

原因是您的 FullServiceAddressCorrectionDelivery1 类(内部 FullServiceAddressCorrectionDelivery)不包含 SubmittingSoftware 元素的定义,但 XML 包含它。然后似乎发生的是 XML 反序列化器可以读取 SubmittingSoftware 之前的属性,但 SubmittingSoftware 之后的所有属性都设置为 null。我在从 Web 服务反序列化 XML 时亲身经历过这种情况。

通常,如果您使用 Web 服务的第 1 版创建客户端,然后创建 Web 服务的第 2 版,在您的数据合同中拥有更多属性,则会发生这种情况。在这些情况下,您需要确保将新属性放在 XML 中的最后(底部)。

于 2012-06-05T10:33:18.403 回答