我正在阅读我的新项目中的一些代码,发现前开发人员正在一起使用Serializable和DataContract。
[Serializable]和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]我假设当有DataContract属性时,WCF会忽略Serializable。这是一个正确的假设吗?如果不是,同时使用这两种方法有什么好处?
发布于 2010-11-23 03:29:33
是,如果存在[DataContract],则忽略[Serializable]。这可能有助于创建一个类型,该类型将具有一个用于WCF的序列化投影,以及另一个用于.NET远程处理的投影(如果由于遗留原因,它与WCF一起使用)。
更新:我在自己的代码中遇到了[DataContract]和[Serializable]都需要的情况。假设您有一个类,其中包含一组自动生成的属性(例如public int Foo {get; set;}),您希望在ASP.NET ViewState和ASP.NET Web API JSON端点(使用Newtonsoft JSON序列化器或DataContractSerializer)中使用这些属性。要让ViewState正常工作,您需要将类设置为[Serializable]。但是,这破坏了JSON序列化,导致类似于{"_k_BackingField123":456}而不是{"Foo":456}的JSON,因为在[Serializable]模型中,自动生成的属性支持字段被序列化,而不是属性本身。但是,如果您还将[DataContract]添加到类型(以及将[DataMember]添加到其属性),则ViewState和JSON方案都可以完美地工作。
https://stackoverflow.com/questions/4249334
复制相似问题