WCF:根元素忽略XmlSerialization属性

时间:2011-08-03 00:43:56

标签: xml wcf serialization xml-serialization

我正在开发一个REStful WCF服务,该服务返回XML Serializer生成的XML(而不是DataContract序列化程序)。

虽然大多数对象的格式正确,但返回的根元素似乎忽略了我的XML序列化属性。

例如,资源/accounts/返回我的AccountList类的XML序列化表示(它本身是我自己的ObjectList<T>类的子类,其上有一些应该序列化的属性)。但是我没有得到我想要的结果。

这是我的代码:

[XmlRoot("accounts")]
public class AccountList : ObjectList<Account> {
}

public class ObjectList<T> : List<T> {
    [XmlAttribute("foo")]
    public Int32 FooProperty { get; set; }
}

[OperationContract]
[WebGet(UriTemplate="/accounts")]
public AccountList GetAccounts() {
    return new AccountList() {
        new Account("bilbo baggins"),
        new Account("steve ballmer")
    };
}

这是Web服务返回的内容:

<arrayOfAccount>
    <Account>
        <name>biblo baggins</name>
    </Account>
    <Account>
        <name>steve ballmer</name>
    </Account>
</arrayOfAccount>

所以主要的问题是我想要忽略我对AccountList类的所需序列化,而且我也想知道如何得到它所以“Account”是小写的,就像“name”属性一样(我用过[这些属性上的XmlElement(“name”)]并且工作正常。

谢谢!

1 个答案:

答案 0 :(得分:0)

不是100%确定这会有效但尝试将以下属性添加到方法中:

[return:XmlArray("accounts")]
[return:XmlArrayItem("account")]

更新

由于[return:*]属性未被拾取,上述操作无效。两个可行的选项:

你可以让AccountList包含一个列表,并在那里使用[XmlElement(“account”)],如下所示:

[XmlRoot("accounts")]
public class AccountList : ObjectList<Account> {
    [XmlElement("account")]
    public List<Account> Accounts { get; set; }
}

public class ObjectList<T> {//: List<T> {
    [XmlAttribute("foo")]
    public Int32 FooProperty { get; set; }
}

或者,如果你不介意改变响应xml,你可以添加一个包装类并使用[XmlArray]和[XmlarrayItem],如前所述:

[XmlRoot("response")]
public class GetAccountResponse {
  [XmlArray("accounts"), XmlArrayItem("account")]
  public AccountList Accounts { get; set; }
}