C#學習筆記25-序列化和反序列化

C#學習筆記25-序列化和反序列化

序列化

序列化 (Serialization)是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程,序列把對象轉換成有序字節流,以便在網絡上傳輸或者保存在本地文件中

序列化的主要目的有三個:
1)以某種存儲形式使自定義對象持久化;
2)將對象從一個地方傳遞到另一個地方;
3)使程序更具維護。

對於需要序列化的對象,需要在類前面聲明[Serializable],表示其可序列化,其語法格式如下所示:

   [Serializable]//表示類可以序列化
    public class Person
    {
        string _name;
        public string Name { get => _name; set => _name = value; }
        public string Gender { get => _gender; set => _gender = value; }

        string _gender;

    }

反序列化

反序列化指把字節序列恢復爲對象的過程,即將二進制轉化爲對象,客戶端從文件中或網絡上獲得序列化後的對象字節流後,根據字節流中所保存的對象狀態及描述信息,通過反序列化重建對象

序列化和反序列化的過程如下所示:

 static void Main(string[] args)
        {
            //要將p1這個對象,傳輸給對方電腦
            Person p1 = new Person();
            p1.Name = "張三";
            p1.Gender = "男";
            using (FileStream fsWrite = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                //開始序列化對象
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(fsWrite, p1);
            }
            Console.WriteLine("序列化成功");


            //接受對方發送過來的二進制 反序列化成對象
            Person p;
            using (FileStream fsRead = new FileStream(@"C:\Users\91134\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
            {
                BinaryFormatter bf1 = new BinaryFormatter();
                p=(Person) bf1.Deserialize(fsRead);
            }
            Console.WriteLine("反序列化成功");
            Console.WriteLine(p.Name);
            Console.WriteLine(p.Gender);

                
            Console.ReadKey();
        }

序列化與反序列化重要是利用Serialize、Deserialize兩個方法,而在.net framework的類庫中提供了三個可以用於序列化和反序列化的類,分別爲BinaryFormatter、SoapFormatter和XmlSerializer,這三種類對象都可調用序列化和反序列的方法進行操作。

BinaryFormatter可以對單個對象,或集合對象(如List、ObservableCollection)進行序列化。
需要指出的是,需要對被序列化的對象添加[Serializable]特性,也就是我們上述提到的格式

XmlSerializer,無論對於單個對象還是集合對象(如List、ObservableCollection),都可以使用XmlSerializer進行序列化。需要指出的是,不需要對被序列化的對象添加[Serializable]特性註解。但是,使用XmlSeriabizable的時候,被序列化的對象應該具有無參數構造函數

而SoapFormatter現在基本被淘汰,不被使用了,用法與BinaryFormatter類似

總結

序列化步驟:

1.得到一個存儲對象的類型

2.創建一個寫入文件流

3.定義要序列化的類型

4.調用序列化方法
  
反序列化步驟:

1.定義一個裝載對象的類型

2.創建一個讀出文件流

3.定義要反序列化的類型

4.調用反序列化方法

二進制序列化的優點:

1. 所有的類成員(包括只讀的)都可以被序列化;

2. 性能非常好。

XML序列化的優點:

1. 互操作性好;

2. 不需要嚴格的二進制依賴;

3. 可讀性強

參考鏈接

1、c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的區別

2、序列化和反序列化

--------------------------------------以上內容由作者原創,歡迎轉載,部分從網絡整理,如侵權清聯繫刪除----------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章