我在我的新项目中阅读一些代码,发现前开发人员正在一起使用Serializable和DataContract。
[Serializable]
和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]
我假设WCF在存在DataContract属性时将忽略Serializable。这是正确的假设吗?如果没有,同时使用两者有什么好处?
最佳答案
是的,如果存在[Serializable]
,则忽略[DataContract]
。这对于例如创建一个类型,该类型将对WCF具有一个序列化投影,而对.NET Remoting具有另一个投影(如果出于传统原因与WCF一起使用)。
更新:我只是遇到了自己的代码中同时需要[DataContract]
和[Serializable]
的情况。假设您要在ASP.NET ViewState和ASP.NET Web API JSON端点(使用Newtonsoft JSON序列化程序或DataContractSerializer)中使用一类具有一堆自动生成的属性(例如public int Foo {get; set;}
)的类。为了使ViewState正常工作,您需要将该类设置为[Serializable]
。但是,这会中断JSON序列化,导致JSON类似于{"_k_BackingField123":456}
而不是{"Foo":456}
,因为在[Serializable]
模型中,自动生成的属性后备字段将被序列化,而不是属性本身。但是,如果您还将[DataContract]
添加到类型(并将[DataMember]
添加到其属性),则ViewState和JSON方案都可以完美地工作。