WCF: атрибут XmlSerialization игнорируется для корневого элемента - PullRequest
1 голос
/ 03 августа 2011

Я работаю над сервисом REStful WCF, который возвращает XML, сгенерированный сериализатором XML (в отличие от сериализатора DataContract).

Хотя большинство объектов правильно отформатированы, корневым элементом являетсякажется, что возвращаемый объект игнорирует мои атрибуты сериализации XML.

Например, ресурс /accounts/ возвращает сериализованное представление XML моего класса AccountList (сам по себе подкласс моего собственного класса 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")
    };
}

И вот что возвращает веб-служба:

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

Таким образом, основная проблема заключается в том, что моя желаемая сериализация в классе AccountList игнорируется, и я также хотел бы знать, как получить ее, чтобы «Account» был в нижнем регистре, как свойство «name» (я использовал [XmlElement ("name")] на этих свойствах, и он отлично работает.

Спасибо!

1 Ответ

0 голосов
/ 03 августа 2011

Не уверен на 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; }
}
...