У меня есть действительно простой настроенный тип коллекции, который наследуется от List <> и использует CollectionDataContract.
Когда я использую DataContractSerializer.WriteObject для его сериализации, он уважает атрибут CollectionDataContract так, как я ожидал; однако, когда я использую его как тип возврата для метода WCF, я получаю ArrayOfFoo по умолчанию.
Мне интересно, есть ли какое-то украшение, которое мне не хватает в контракте на обслуживание.
подробности:
[DataContract(Namespace = "")]
public class Foo
{
[DataMember]
public string BarString { get; set; }
}
[CollectionDataContract(Namespace = "")]
[Serializable]
public class FooList : List<Foo> {}
Если я просто создаю экземпляр Foo, а затем использую DataContractSerializer.WriteObject для его сериализации, я получаю то, что вы ожидаете:
<FooList>
<Foo>
<BarString>myString1</BarString>
</Foo>
</FooList>
Однако, если у меня есть служба с таким методом, как этот ...
[ServiceContract Name = "MyService"]
public interface IMyService
{
[OperationContract, WebGet(UriTemplate = "foos/")]
FooList GetAllFoos();
}
, а затем сделать GET для http://www.someEndpoint.com/foos/, Я получаю это:
<ArrayOfFoo>
<Foo>
<BarString>myString1</BarString>
</Foo>
</ArrayOfFoo>
Я также попытался указать Name = "MyFooListName" в атрибуте CollectionDataContract. Те же результаты: DataContractSerializer получает памятку; WCF нет.