WCF和DataContractSerializer是否以不同方式序列化CollectionDataContract修饰的集合类型?

pis*_*ado 5 wcf datacontractserializer

我有一个非常简单的自定义集合类型,它继承自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> {}
Run Code Online (Sandbox Code Playgroud)

如果我只是实例化一个Foo,然后使用DataContractSerializer.WriteObject来序列化它,我会得到你所期望的:

<FooList>
    <Foo>
        <BarString>myString1</BarString>
    </Foo>
</FooList>
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个像这样的方法的服务...

[ServiceContract Name = "MyService"]
public interface IMyService
{
    [OperationContract, WebGet(UriTemplate = "foos/")]
    FooList GetAllFoos();
}
Run Code Online (Sandbox Code Playgroud)

然后为http://www.someEndpoint.com/foos/做一个GET ,我明白了:

<ArrayOfFoo>
    <Foo>
        <BarString>myString1</BarString>
    </Foo>
</ArrayOfFoo>
Run Code Online (Sandbox Code Playgroud)

我也尝试在CollectionDataContract属性中指定Name ="MyFooListName".相同的结果:DataContractSerializer获取备忘录; WCF没有.

pis*_*ado 3

Saeed 给我指明了正确的方向:当我一直希望使用 DataContractSerializer 时,我无意中最终得到了 XmlSerializer。

我最终得到了 XmlSerializer...好吧...通过要求它。

特别是,我在服务中使用 XmlSerializerFormat 修饰了方法,如下所示:

[ServiceContract Name = "MyService"] 
public interface IMyService 
{ 
    //  ... other stuff ...

    [OperationContract, WebInvoke(UriTemplate = "foos/", Method = "POST")] 
    [XmlSerializerFormat]
    Foo PostAFoo(Foo yourNewFoo);
} 
Run Code Online (Sandbox Code Playgroud)

我这样做是希望能够宽恕手卷 Foo XML blob 中的成员顺序。当然,当这样做时,最终会得到 XmlSerializer,而不是 DataContractSerializer。

当我去掉 XmlSerializerFormat 属性时,问题就解决了:WCF 现在正在按照我想要的方式序列化我的 FooList 集合。