控制 Web 服务序列化

Controlling Web Service Serialization

在我的网络服务中,我有以下 class

public class ContactDetails
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Postcode { get; set; }
    public List<string> PhoneNumber { get; set; }
}

其中,按原样,returns下面的数据在XML输出

<ContactDetails>
    <Name>MR SMITH</Name>
    <Address>I HIGH STREET, SOMETOWN</Address>
    <Postcode>AA1 2BB</Postcode>
    <PhoneNumber>
        <string>01234 567890</string>
        <string>01234 567890</string>
    </PhoneNumber>
</ContactDetails>

显然,我们希望 phone 号码在 PhoneNumbers>PhoneNumber 中的结构更合理,但似乎不太正确。

我们已经添加了 XmlElement 标记,这几乎已经完成;这样

public class ContactDetails
{
    public string Name { get; set; }
    public string Address { get; set; }
    [XmlElement(ElementName = "PC")]
    public string Postcode { get; set; }
    [XmlElement(ElementName = "PhoneNumber")]
    public List<string> PhoneNumber { get; set; }
}

生成以下内容

<ContactDetails>
    <Name>MR SMITH</Name>
    <Address>I HIGH STREET, SOMETOWN</Address>
    <PC>AA1 2BB</PC>
    <PhoneNumber></PhoneNumber>
    <PhoneNumber></PhoneNumber>
</ContactDetails>

但是如您所见,我们现在已经丢失了 phone 个数字的嵌套......所需的输出将是:

<ContactDetails>
    <Name>MR SMITH</Name>
    <Address>I HIGH STREET, SOMETOWN</Address>
    <PC>AA1 2BB</PC>
    <PhoneNumbers>
        <PhoneNumber></PhoneNumber>
        <PhoneNumber></PhoneNumber>
    </PhoneNumbers>
</ContactDetails>

您要使用的属性是:

  1. XmlArrayAttribute -- 控制二级列表的外层名称。

  2. XmlArrayItemAttribute - 控制二级列表的内部名称。

因此:

public class ContactDetails
{
    public string Name { get; set; }
    public string Address { get; set; }
    public string Postcode { get; set; }
    [XmlArray("PhoneNumbers")]
    [XmlArrayItem("PhoneNumber")]
    public List<string> PhoneNumber { get; set; }
}