ArrayOf при использовании List <T>со службой отдыха WCF - PullRequest
4 голосов
/ 22 июня 2010

Я пытаюсь создать веб-сервис REST, используя .NET 4.0 и WCF.Моя служба REST возвращает список, который затем сериализуется в XML.У меня проблема в том, что возвращаемый XML начинается с ArrayOf, что мне не нравится.

Другими словами, сейчас XML выглядит так:

<ArrayOfAchievement>
    <Achievement>
        ...
    </Achievement>
</ArrayOfAchievement>

Я бы предпочел, чтобы XML выглядел так:

<Achievements>
    <Achievement>
        ...
    </Achievement>
</Achievements>

Если я создамновый класс и назовите его AchievementsList, который имеет свойство List , например так:

public class AchievementsList
{
    public List<Achievement> Achievements { get; set; }
}

Затем мой сервис вернет вышеуказанный класс вместо List , XML в конечном итоге будет выглядетькак это:

<AchievementsList>
    <Achievements>
        <Achievement>
            ...
        </Achievement>
    </Achievements>
</AchievementsList>

Что не так (потому что он добавляет еще один уровень, который там не принадлежит).

Другая проблема заключается в том, что мне также нужно применить пространство имен к объектуПримерно так:

[XmlRoot(Namespace="NameSpaceURL")]
public class AchievementsList
{
    public List<Achievement> Achievements { get; set; }
}

Что я не могу сделать, если просто возвращаю список <Достижения>.

Так что я могу сделать с этими двумя проблемами?

Бар

Ответы [ 3 ]

4 голосов
/ 22 июня 2010
  1. Вы на правильном пути с классом AchievementList, но вам нужно украсить свойство списка Achievements атрибутом XmlElement и указать имяотдельные элементы.

  2. Пространство имен принадлежит классу AchievementList, так же, как у вас.

Пример кода:

[Serializable]
public class Achievement {
    public string Name { get; set; }
}

[Serializable]
[XmlRoot(ElementName="Achievements", Namespace="http://www.mynamespace.com")]
public class AchievementList
{      
    [XmlElement("Achievement")]
    public List<Achievement> Achievements { get; set; }

    public AchievementList()
    {
        Achievements = new List<Achievement>();
    }

    public void Add(Achievement a)
    {
        Achievements.Add(a);
    }
}

И ваш вывод будет примерно таким:

<?xml version="1.0" encoding="utf-16"?>
<Achievements xmlns="http://www.mynamespace.com">
  <Achievement>
    <Name>Woke Up</Name>
  </Achievement>
  <Achievement>
    <Name>Went to work</Name>
  </Achievement>
  <Achievement>
    <Name>Slacked off</Name>
  </Achievement>
</Achievements>}
1 голос
/ 25 апреля 2011

Я задал связанный вопрос о том, как десериализовать XML, созданный методом веб-сервиса WCF, который возвращает List<SomeType>.

XML имеет корень с именем <ArrayOfSomeType>, и для десериализации его обратно в List<SomeType> необходимо использовать DataContractSerializer вместо XmlSerializer, поскольку они несовместимы.

1 голос
/ 29 июня 2010

У меня есть похожая настройка, работающая так: получить AchievementsList из List<Achievement>, украсить его XmlTypeAttribute и XmlRootAttribute, а также Achievement XmlTypeAttribute:

[XmlType(TypeName = "Achievements", Namespace="http://www.mynamespace.com")]
[XmlRoot(ElementName = "Achievements", Namespace="http://www.mynamespace.com")]
public class AchievementsList : List<Achievement>
{
}

[XmlType(TypeName = "Achievement", Namespace="http://www.mynamespace.com")]
public class Achievement
{
    ...
}

Я также украсил свою реализацию сервиса атрибутом XmlSerializerFormat, чтобы избежать обычной сериализации DataContract.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...