我正在閱讀我的新項目中的一些代碼,發現前開發者一起使用了Serializable和DataContract。可序列化和DataContract(而不是?)
[Serializable]
和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]
我假設時,有一個DataContract屬性WCF會忽略序列化。這是一個正確的假設嗎?如果不是,同時使用兩者有什麼好處?
我正在閱讀我的新項目中的一些代碼,發現前開發者一起使用了Serializable和DataContract。可序列化和DataContract(而不是?)
[Serializable]
和
[DataContract(Namespace="Some.Name.Space", IsReference = true)]
我假設時,有一個DataContract屬性WCF會忽略序列化。這是一個正確的假設嗎?如果不是,同時使用兩者有什麼好處?
是的,如果存在[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方案都可以很好地工作。
感謝您的詳細解釋。 – fizmhd 2016-02-08 07:51:23