Serializable和DataContract(不是?)

ton*_*yjy 11 .net c# wcf web-services

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

[Serializable]
Run Code Online (Sandbox Code Playgroud)

[DataContract(Namespace="Some.Name.Space", IsReference = true)]
Run Code Online (Sandbox Code Playgroud)

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

Eug*_*sky 17

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

UPDATE:我只是遇到了一个情况,我自己的代码,其中两个[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场景都能很好地工作.