序列化是將對(duì)象狀態(tài)轉(zhuǎn)換為可保持或傳輸?shù)男问降倪^程。序列化的補(bǔ)集是反序列化,后者將流轉(zhuǎn)換為對(duì)象。這兩個(gè)過程一起保證數(shù)據(jù)易于存儲(chǔ)和傳輸。
.NET Framework 提供了兩個(gè)序列化技術(shù):
二進(jìn)制序列化保持類型保真,這對(duì)于多次調(diào)用應(yīng)用程序時(shí)保持對(duì)象狀態(tài)非常有用。例如,通過將對(duì)象序列化到剪貼板,可在不同的應(yīng)用程序之間共享對(duì)象。您可以將對(duì)象序列化到流、磁盤、內(nèi)存和網(wǎng)絡(luò)等。遠(yuǎn)程處理使用序列化,“按值”在計(jì)算機(jī)或應(yīng)用程序域之間傳遞對(duì)象。
xml 序列化只序列化公共屬性和字段,并且不保持類型保真。當(dāng)您希望提供或使用數(shù)據(jù)而不限制使用該數(shù)據(jù)的應(yīng)用程序時(shí),這一點(diǎn)非常有用。由于 XML 是開放式的標(biāo)準(zhǔn),因此它對(duì)于通過 Web 共享數(shù)據(jù)來說是一個(gè)理想選擇。SOAP 同樣是開放式的標(biāo)準(zhǔn),這使它也成為一個(gè)理想選擇。
具體命名空間:
包含可用于序列化和反序列化對(duì)象的類。(包括System.Runtime.Serialization.Formatters.Binary.BinaryFormatter,還有WCF中用到的DataContractAttribute,DataMemberAttribute)
包含可用于將對(duì)象序列化為 XML 格式的文檔或流的類。
WCF大家很熟悉,一般的書籍都對(duì)基礎(chǔ)的東西有很多內(nèi)容的講解,這里就對(duì)非WCF的一些序列化技巧拋個(gè)磚。
需要序列化:[Serializable]也可以寫成[SerializableAttribute]
特性“Serializable”只在“class, struct, enum, delegate”聲明中有效。所以只能在類,結(jié)構(gòu)體等上面標(biāo)記。
不需要序列化:[NonSerialized]也可以寫成[NonSerializedAttribute]
特性“NonSerialized”只在“field”聲明中有效。所以只能在字段上標(biāo)記,連屬性器都不行。
事件的標(biāo)記:
[field: NonSerializedAttribute()],需要加入field標(biāo)記。
屬性的標(biāo)記:
其實(shí)我們叫的屬性是屬性器,是一對(duì)Get,Set方法。既然是方法,當(dāng)然不是字段了,所以是不能序列化標(biāo)記或者排除的,那我們怎么去處理某些屬性不需要序列化的情況列。方法也是有的,需要把屬性器中的Get,Set方法寫實(shí),即該有的字段還是得定義,不能偷懶,然后在該有的字段上面標(biāo)記為不需要序列化。
學(xué)過C#的時(shí)候,大家都知道了個(gè)值類型,引用類型的概念,也可能知道了ICloneable這個(gè)接口,這個(gè)克隆接口可以復(fù)制對(duì)象,如實(shí)例化個(gè)student,然后調(diào)用Clone()即可以得到該對(duì)線的淺層副本。
淺層克隆就是只把改對(duì)象的值類型和引用類型的地址復(fù)制了,但是,原來對(duì)象中的被引用類型的對(duì)象發(fā)生改變,比如:student類中有個(gè)classroom,classroom中的某個(gè)字段發(fā)生改變,這樣克隆后的對(duì)線的classroom的值也是會(huì)變的。除非classroom這個(gè)類也實(shí)現(xiàn)ICloneable接口。
序列化克隆的好處就是不用考慮淺層復(fù)制,深層復(fù)制,直接將要克隆的對(duì)象序列化,然后反序列化得到的對(duì)象就是我們期望的結(jié)果。
按照上面的說明,代碼如下:
Student類
1 [Serializable] 2 public class Student 3 { 4 [field: NonSerializedAttribute()] 5 public event EventHandler Changed; 6 [NonSerialized] 7 PRivate ExParam param; 8 9 public string ID10 {11 get;12 set;13 }14 15 public string Name16 {17 get;18 set;19 }20 21 public ClassRoom Room22 {23 get;24 set;25 }26 27 public ExParam Param28 {29 get30 {31 return param;32 }33 set34 {35 param = value;36 }37 }38 }ClassRoom類
1 [Serializable] 2 public class ClassRoom 3 { 4 5 public string Name 6 { 7 get; 8 set; 9 }10 11 public string Address12 {13 get;14 set;15 }16 }ExParam類
1 public class ExParam2 {3 public string Name4 {5 get;6 set;7 }8 }Util類
1 public class Util 2 { 3 public static byte[] SerializeObject(object obj) 4 { 5 if (obj == null) 6 return null; 7 8 using (MemoryStream memory = new MemoryStream()) 9 {10 BinaryFormatter formatter = new BinaryFormatter();11 formatter.Serialize(memory, obj);12 memory.Position = 0;13 byte[] read = new byte[memory.Length];14 memory.Read(read, 0, read.Length);15 memory.Close();16 return read;17 }18 }19 20 21 public static object DeserializeObject(byte[] data)22 {23 object obj = null;24 if (data == null)25 return obj;26 27 using (MemoryStream memory = new MemoryStream(data))28 {29 memory.Position = 0;30 BinaryFormatter formatter = new BinaryFormatter();31 obj = formatter.Deserialize(memory);32 memory.Close();33 return obj;34 }35 }36 }主窗體
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 Student student = new Student() 4 { 5 ID = "201401", 6 Name = "攻城獅", 7 Room = new ClassRoom() 8 { 9 Name = "博客園",10 Address = "小山村"11 },12 Param = new ExParam()13 {14 Name = "程序猿"15 }16 };17 18 byte[] data = Util.SerializeObject(student);19 20 Student student1 = Util.DeserializeObject(data) as Student;21 22 Print(student);23 Print(student1);24 }25 26 private void Print(Student student)27 {28 string info =string.Format("{0}{1}{2}{3}"29 , "hashcode:" + student.GetHashCode().ToString() + " "30 , student.ID + " " + student.Name + " "31 , student.Room != null ? student.Room.Name + " " + student.Room.Address + " "+student.Room.GetHashCode().ToString()+" " : "room is null "32 , student.Param != null ? student.Param.Name : "param is null"33 );34 listPrint.Items.Add(info);35 }上述代碼輸出:
從上述代碼輸出的結(jié)果我們可以看出
源碼下載
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注