Serializable和DataContract(不是?)

时间:2010-11-22 19:20:40

标签: c# .net wcf web-services

我在新项目中阅读了一些代码,发现前开发人员正在使用Serializable和DataContract。

[Serializable]

[DataContract(Namespace="Some.Name.Space", IsReference = true)]

我假设当存在DataContract属性时,WCF将忽略Serializable。这是正确的假设吗?如果没有,同时使用两者有什么好处?

1 个答案:

答案 0 :(得分:17)

是的,如果[Serializable]存在,则会忽略[DataContract]。这可能对例如创建一个将为WCF提供一个序列化投影的类型,以及另一个.NET Remoting投影(如果由于遗留原因与WCF一起使用)。

更新:我刚遇到自己的代码,其中[DataContract][Serializable]都是必需的。假设您有一个类,其中包含一组自动生成的属性(例如public int Foo {get; set;}),您希望在ASP.NET ViewState和ASP.NET Web API JSON端点中使用两者(它使用Newtonsoft JSON序列化程序或DataContractSerializer)。要使ViewState起作用,您需要将类设为[Serializable]。但是,这会破坏JSON序列化,从而导致JSON像{"_k_BackingField123":456}而不是{"Foo":456},因为在[Serializable]模型中,自动生成的属性支持字段将被序列化而不是属性本身。但是,如果您[DataContract]添加到类型(以及[DataMember]到其属性),则ViewState和JSON方案都可以正常运行。