我在新项目中阅读了一些代码,发现前开发人员正在使用Serializable和DataContract。
[Serializable]
和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]
我假设当存在DataContract属性时,WCF将忽略Serializable。这是正确的假设吗?如果没有,同时使用两者有什么好处?
我在新项目中阅读了一些代码,发现前开发人员正在使用Serializable和DataContract。
[Serializable]
和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]
我假设当存在DataContract属性时,WCF将忽略Serializable。这是正确的假设吗?如果没有,同时使用两者有什么好处?
是, [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场景都能很好地工作。
是, [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场景都能很好地工作。