嘿嘿,不論發生什么的情況,學校沒有老師上課也好,我們都要自己主動地學習啦,學習是不能落下的啦,雖然我們這周沒有老師給我們上課,但是我們只有自己學習啦,還記得前幾天,老是簡單的說啦下序列化,那時間也只是簡單的聽啦一下大概的內容,只知道需要一個關鍵字啦,今天沒有上課也就沒有什么新的知識總結啦,那么我就自己尋找些自己想知道的啦,下面詳細的總結下序列化與反序列化啦。
一.序列化
序列化:就是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。
序列化的應用:將對象持久化存儲,磁盤、數據庫;將對象復制到剪貼板;將對象通過網絡傳輸;將對象備份(深拷貝。)
序列化的命名空間:using System.Runtime.Serialization.Formatters.Binary;
下面就先使用List泛型舉例簡單的說一下:
List<int> list = new List<int>(); //list泛型 list.Add(1); list.Add(2); list.Add(3); using (FileStream fs = new FileStream("data.txt", FileMode.Create)) //當創建文件時間使用Create { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, list); //在這里就是序列化的方法,把對象轉化成二進制的形式通過流保存在文件中 }
if (File.Exists("data.txt")) //當反序列化時間首先判斷文件是否存在 using (FileStream fs = new FileStream("data.txt", FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); List<int> list = bf.Deserialize(fs) as List<int>; //在這里需要注意,我們序列化進去的是一個什么類型,那么我們反序列回來的就是什么類型,而bf.Deserialize(fs)返回的本是一個object類型,所以轉換為list<int>類型 //通過流讀文件把流中的內容反序列化成對象 for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); //遍歷出每一項 } }
這里就是我們反序列化的創建啦,我們可以看到上面的第一行代碼,在這里我們要注意啦,在反序列化前,一定要判斷我們序列化的文件是否存在,在存在的情況下,我們可以反序列化啦,我們序列化時間使用的方法是Serialize,而在反序列化時間調用的是Deserialize方法,還有我們在反序列化時間要注意類型的轉化啦,這個是非常重要的啦。
下面就寫一個自己定義的類,在這個類中可以有繼承,然后讓其序列化與反序列化啦。
首先定義一個Student類,在定義一個Person類與Dog類,Person為父類,Student為子類,繼承父類Person類,而Dog僅僅為Student的一個屬性,下面讓其序列化與反序列化一下。
[Serializable] class Person { private int age; public int Age { get { return age; } set { age = value; } } }
[Serializable] class Student :Person { private string name; public string Name { get { return name; } set { name = value; } } private Dog dog; internal Dog Dog { get { return dog; } set { dog = value; } } public void SayHi() { Console.WriteLine(this.name); } }
[Serializable] class Dog { private string name; public string Name { get { return name; } set { name = value; } } } }
上面是定義的三個類,實現了繼承方法,在這里需要注意的是:序列化不會通過繼承關系而繼承,因此,當無論是Student類還是Person任何一個類要序列化,那么他們都要序列化,而Student中的屬性類在這里也是必須實現可序列化的,這里是容易出錯的地方,我們要更加的注意的啦。
下面就寫一下實現序列化和反序列化的方法,
#region 自定義一個可序列化的類 Student s = new Student(); s.Name = "zhangsan"; s.Dog = new Dog(); //在這里是因為定義啦一個Dog的類,而把Dog這個類作為Student的其中一個屬性 s.Dog.Name = "xiaogou"; using (FileStream fs = new FileStream("a.txt", FileMode.Create)) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, s); } #endregion
#region 自定義反序列化 if (File.Exists("a.txt")) { using (FileStream fs = new FileStream("a.txt", FileMode.Open)) { BinaryFormatter bf = new BinaryFormatter(); Student s= bf.Deserialize(fs) as Student; s.Dog.Name = "xiaogou"; s.SayHi(); Console.WriteLine(s.Dog.Name); } } #endregion
通過上面的方法對比,一個是系統定義好的List類,一個是我們自己定義的可序列化的Person,Student與Student的屬性Dog類,而他們要實現序列化的方法都是要添加一個可序列化的標識,僅此而已,我們在實現序列化時間一定要注意添加標識即可,然后即可實現其序列化與反序列化。
嘿嘿,我終於知道啦序列化與反序列化啦,雖然僅僅認識啦而已,但是還是蠻高興的啦,據說序列化好難得啊,但是這還是簡單的初步認識而已,我還是會繼續學習這個的啦,嘿嘿,努力嘍。
