序列化是將對象狀態轉換為可保持或傳輸的形式的過程。序列化的補集是反序列化,後者將流轉換為對象。這兩個過程一起保證數據易於存儲和傳輸。
.NET Framework 提供了兩個序列化技術:
二進制序列化保持類型保真,這對於多次調用應用程序時保持對象狀態非常有用。例如,通過將對象序列化到剪貼板,可在不同的應用程序之間共享對象。您可以將對象序列化到流、磁盤、內存和網絡等。遠程處理使用序列化,“按值”在計算機或應用程序域之間傳遞對象。
XML 序列化只序列化公共屬性和字段,並且不保持類型保真。當您希望提供或使用數據而不限制使用該數據的應用程序時,這一點非常有用。由於 XML 是開放式的標准,因此它對於通過 Web 共享數據來說是一個理想選擇。SOAP 同樣是開放式的標准,這使它也成為一個理想選擇。
具體命名空間:
包含可用於序列化和反序列化對象的類。(包括System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,還有WCF中用到的DataContractAttribute, DataMemberAttribute)
包含可用於將對象序列化為 XML 格式的文檔或流的類。
WCF大家很熟悉,一般的書籍都對基礎的東西有很多內容的講解,這裡就對非WCF的一些序列化技巧拋個磚。
特性“Serializable”只在“class, struct, enum, delegate”聲明中有效。所以只能在類,結構體等上面標記。
不需要序列化:[NonSerialized]也可以寫成[NonSerializedAttribute]
特性“NonSerialized”只在“field”聲明中有效。所以只能在字段上標記,連屬性器都不行。
[field: NonSerializedAttribute()],需要加入field標記。
其實我們叫的屬性是屬性器,是一對Get,Set方法。既然是方法,當然不是字段了,所以是不能序列化標記或者排除的,那我們怎麼去處理某些屬性不需要序列化的情況列。方法也是有的,需要把屬性器中的Get,Set方法寫實,即該有的字段還是得定義,不能偷懶,然後在該有的字段上面標記為不需要序列化。
學過C#的時候,大家都知道了個的概念,也可能知道了ICloneable這個接口,這個克隆接口可以復制對象,如實例化個student,然後調用Clone()即可以得到該對線的淺層副本。
淺層克隆就是只把改對象的值類型和引用類型的地址復制了,但是,原來對象中的被引用類型的對象發生改變,比如:student類中有個classroom,classroom中的某個字段發生改變,這樣克隆後的對線的classroom的值也是會變的。除非classroom這個類也實現ICloneable接口。
序列化克隆的好處就是不用考慮淺層復制,深層復制,直接將要克隆的對象序列化,然後反序列化得到的對象就是我們期望的結果。
按照上面的說明,代碼如下:
Student類
param = }
}
ExParam類
}
Util類
[] SerializeObject( (obj == (MemoryStream memory = BinaryFormatter formatter = memory.Position = [] read = memory.Read(read, DeserializeObject( obj = (data == (MemoryStream memory = memory.Position = BinaryFormatter formatter = obj = }
主窗體
Form1_Load( Student student = ID = Name = Room = Name = Address = Param = Name = [] data = Student student1 = Util.DeserializeObject(data) info =.Format( , + student.GetHashCode().ToString() + , student.ID + + student.Name + , student.Room != ? student.Room.Name + + student.Room.Address + +student.Room.GetHashCode().ToString()+ : , student.Param != ? student.Param.Name : }
上述代碼輸出:
從上述代碼輸出的結果我們可以看出
源碼下載