我正在开发一个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”)]并且工作正常。
谢谢!
答案 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; }
}