2010-11-22 64 views
11

我正在閱讀我的新項目中的一些代碼,發現前開發者一起使用了Serializable和DataContract。可序列化和DataContract(而不是?)

[Serializable] 

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

我假設時,有一個DataContract屬性WCF會忽略序列化。這是一個正確的假設嗎?如果不是,同時使用兩者有什麼好處?

回答

15

是的,如果存在[DataContract],則忽略[Serializable]。這可能對例如創建一個類型,將有一個WCF的序列化投影,以及.NET Remoting的另一個投影(如果它由於傳統原因與WCF一起使用)。

更新:我剛跑進自己的代碼的情況下都[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方案都可以很好地工作。

+0

感謝您的詳細解釋。 – fizmhd 2016-02-08 07:51:23