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没有.
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 集合。
归档时间: |
|
查看次数: |
1224 次 |
最近记录: |