嘿嘿,學習啦序列化


                 嘿嘿,不論發生什么的情況,學校沒有老師上課也好,我們都要自己主動地學習啦,學習是不能落下的啦,雖然我們這周沒有老師給我們上課,但是我們只有自己學習啦,還記得前幾天,老是簡單的說啦下序列化,那時間也只是簡單的聽啦一下大概的內容,只知道需要一個關鍵字啦,今天沒有上課也就沒有什么新的知識總結啦,那么我就自己尋找些自己想知道的啦,下面詳細的總結下序列化與反序列化啦。

           一.序列化

          序列化:就是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程。在序列化期間,對象將其當前狀態寫入到臨時或持久性存儲區。以后,可以通過從存儲區中讀取或反序列化對象的狀態,重新創建該對象。

          序列化的應用:將對象持久化存儲,磁盤、數據庫;將對象復制到剪貼板;將對象通過網絡傳輸;將對象備份(深拷貝。)

          序列化的命名空間: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);   //在這里就是序列化的方法,把對象轉化成二進制的形式通過流保存在文件中
            }

 

                   在這里我們利用List<int>  創建了一個序列化,而在這里為什么可以序列化那,主要是因為List是一個可序列化類,而可序列化類的標識是什么那?就是在類的前面添加一個[Serializable]即可,下面我們就寫一個反序列化的模式,當然,反序列化是在序列化存在的情況下才能創建,因此在這里需要注意啦。
                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類,而他們要實現序列化的方法都是要添加一個可序列化的標識,僅此而已,我們在實現序列化時間一定要注意添加標識即可,然后即可實現其序列化與反序列化。

          嘿嘿,我終於知道啦序列化與反序列化啦,雖然僅僅認識啦而已,但是還是蠻高興的啦,據說序列化好難得啊,但是這還是簡單的初步認識而已,我還是會繼續學習這個的啦,嘿嘿,努力嘍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM