Serializable和DataContract(不是?)

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

[Serializable] 

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

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

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

更新 :我刚刚在我自己的代码中遇到了一个情况,其中[DataContract][Serializable]都是必需的。 假设您有一个类,其中public int Foo {get; set;}自动生成的属性(例如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场景都可以正常工作。