REST XML-сериализация списков абстрактных классов с атрибутом «i: type» - как преобразовать это в имя тега? - PullRequest
0 голосов
/ 28 февраля 2011

Я пишу службу REST WCF с методами для получения коллекции ресурсов и одного ресурса.Мои ресурсы - это классы, основанные на одном абстрактном классе.В моем методе для получения коллекции у меня есть:

[WebGet(UriTemplate = "")]
[ServiceKnownType(typeof(File)), ServiceKnownType(typeof(Text))]
List<ResourceBase> GetCollection();

, и это создает XML, который выглядит следующим образом:

<ArrayOfResourceBase xmlns="..." xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <ResourceBase i:type="Text">
    ...
    </ResourceBase>
    <ResourceBase i:type="File">
    ...
    </ResourceBase>
</ArrayOfResourceBase>

Мой метод одного объекта выглядит так:

[WebGet(UriTemplate = "{id}")]
[ServiceKnownType(typeof(File)), ServiceKnownType(typeof(Text))]
ResourceBase Get(string id);

и создает XML следующим образом:

<Text xmlns="..." xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
...
</Text>

Есть ли способ заставить эти две части XML выглядеть одинаково, то есть избавиться от тегов "i: type" в ArrayOf... и преобразовать их в имя тега, или заставить их в ответе одного объекта?

1 Ответ

0 голосов
/ 31 марта 2011

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

  1. Измените настраиваемое имя DataContract класса DataContract ResourceBase, чтобы оно всегда было Text. Вот так:

    [DataContract (Name = "Текст")] класс ResourceBase { ... }

  2. Подключите DataContractSurrogate к особому случаю этого типа

  3. Подключите пользовательский DataContractSerializerOperationBehavior, который включает пользовательский дочерний объект DataContractSerializer, который в особых случаях использует этот тип

  4. Использовать XmlSerializer. См. это сообщение в блоге .

...