2012-09-17 72 views
15

我期待在偷別人的C#代碼和公共枚舉之前有下面幾行:什麼[System.SerializableAttribute()做

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 

有人可以用簡單的英語解釋這些線是什麼是做。

+0

這表明一個類可以被序列化:http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx – Steven

+0

是的,已經遇到了那個頁面 - 它對我沒有多大意義 - 我是新來的C# – Graham

+2

這不是別人的elses代碼,這是生成的代碼,由xsd.exe生成。 – Steven

回答

9

的System.SerializableAttribute指定給運行時那類的實例可以被序列化

EG。您在WCF服務調用中返回一個對象。如果該對象具有此屬性,並且其中的所有對象都是可序列化的,則運行時將根據Web服務返回的資源類型將該對象轉換爲JSON或XML。

+0

乾杯 - 基本上,我可以忽略它,因爲它不影響我如何使用它。 – Graham

+5

WCF通常使用'DataContractSerializer'; 'DataContractSerializer'實際上不需要'[Serializable]' - 它更喜歡'[DataContract]' –

3

這只是長期爲[Serializable]。它將類標記爲可以與其他格式「轉換」的類。

常見示例包括將類'序列化'爲JSON或XML數據結構,以及對這些結構進行等效轉換。

考慮一類

[Serializable] 
class MyClass 
{ 
    public string Mem1 {get; set;} 
    public string Mem2 {get; set;} 
} 

... 
MyClass mc = new MyClass; 
mc.Mem1 = "Hello"; 
mc.Mem2 = "World"; 

當序列化到JSON結構,我們得到:

"{'Mem1':'Hello','Mem2':'World'}" 

而鑑於過程的性質雙向的,如果我們收到這種格式的信息(例如從某個Web服務返回),那麼我們可以愉快地將它序列化回這個類的一個實例。

基於JSON示例,我們在命名空間System.Web.Script.Serialization中找到了一系列可以幫助我們完成此操作的類。特別是,JavaScriptSerializer類可以幫助我們提供Serialize()Deserialize方法。

+1

您的JSON或XML示例通常使用JavaScriptSerializer,DataContractSerializer,XmlSerializer或JSON.NET;其中沒有一個關心'[Serializable]'。 –

+0

誠然,如果我們確實可以保證它只會以這種方式連續化。 –

52

這實際上是相當微妙...

表面上,簡單的答案是「它增加了SerialiableAttribute爲類的元數據」,其中的SerializableAttribute目的是爲了做廣告(的事情如BinaryFormatter)可以序列化一個類型。 BinaryFormatter將拒絕序列化未明確公佈的用於序列化的事物。這可能是因爲BinaryFormatter被用於執行遠程處理,並防止數據意外泄漏到遠程邊界。

注意,大多數串行不護理SerializableAttribute,所以這影響之類的東西BinaryFormatter。例如,XmlSerializer,DataContractSerializer,JavaScriptSerializer,JSON.NET或protobuf-net都不在乎SerializableAttribute

然而,實際上,它是標準的屬性,而是由編譯器進行特殊處理:

  • 大多數屬性在技術上.custom instance值(IL條款)
  • 然而, ,SerialiableAttribute實際上映射到CLI .class標誌,serializable

這並不改變的含義,但是:作爲一個新奇的事實,SerializableAttribute實際上並未實現爲屬性

+0

有趣!感謝那個Mark。 –

+1

馬克你能詳細解釋IL部分嗎?更改意味着什麼,爲什麼這個屬性的處理方式不同?謝謝 – gdoron