1. 程式人生 > >C# 序列化(Serialize)與反序列化(Deserialize)

C# 序列化(Serialize)與反序列化(Deserialize)

序列化又稱序列化,是.NET執行時環境用來支援使用者定義型別的流化的機制。其目的是以某種儲存形成使自定義物件持久化,或者將這種物件從一個地方傳輸到另一個地方。
.NET框架提供了兩種種序列化的方式:1、是使用BinaryFormatter進行序列化;2、使用XmlSerializer進行序列化。第一種方式提供了一個簡單的二進位制資料流以及某些附加的型別資訊,而第二種將資料流格式化為XML儲存。 可以使用[Serializable]屬性將類標誌為可序列化的。如果某個類的元素不想被序列化,1、可以使用[NonSerialized]屬性來標誌,2、可以使用[XmlIgnore]來標誌。

1.BinaryFormatter
名稱空間:System.Runtime.Serialization.Formatters.Binary;
下面先定義一個可序列化類:

[Serializable] //表示該類可被序列化
class Peoson {
    public Peoson() { } 
    public Peoson(string name, int age)
    {
        this.name = name;
        this.age = age;
     }
    private string name;
    public string Name
     {
        get { return name; }
        set { name = value; }
     }
     [NonSerialized] //表示下面這個age欄位不進行序列化
    private int age;
    public int Age
    {
        get { return age; }
        set { age = value; }
     }
    public void SayHi()
     {
         Console.WriteLine("大家好,我是{0},今年{1}歲",name,age);
     }
 }

Main函式中:

List<Peoson> listPers = new List<Peoson>();
Peoson per1 = new Peoson("張三", 18);
Peoson per2 = new Peoson("李四", 20);
listPers.Add(per1);
listPers.Add(per2);
SerializeMethod(listPers);
//ReserializeMethod(); //反序列化成把上面一行註釋掉 執行此行
Console.ReadKey();

序列化和反序列化的方法:

static void ReserializeMethod()
{
    //反序列化
    using (FileStream fs = new FileStream("1.bin", FileMode.Open))
    {
        BinaryFormatter bf = new BinaryFormatter();
        List<Peoson> list = bf.Deserialize(fs) as List<Peoson>;
        if (list != null)
         {
            for (int i = 0; i < list.Count; i++)
            { 
                 list[i].SayHi();
            } 
         }
     }
}
static void SerializeMethod(List<Peoson> listPers)
 {
    //序列化
    using (FileStream fs = new FileStream("1.bin", FileMode.Create))
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs, listPers);
    }
}
}

反序列化輸出結果:
大家好,我是張三,今年0歲
大家好,我是李四,今年0歲
由此看出,未序列化的欄位儲存的值為空。

2、使用XmlSerializer進行序列化
關於格式化器還有一個問題,假設我們需要 XML,有兩中方案:要麼編寫一個實現IFormatter介面的類,採用的方式類似於SoapFormatter類,但是沒有你不需要的資訊;要麼使用 庫類XmlSerializer,這個類不使用Serializable屬性,但是它提供了類似的功能。
如果我們不想使用主流的序列化機制,而想使用XmlSeralizer進行序列化我們需要做一下修改:
a.新增System.Xml.Serialization名稱空間。
b.Serializable和NoSerialized屬性將被忽略,而是使用XmlIgnore屬性,它的行為與NoSerialized類似。
c.XmlSeralizer要求類有個預設的構造器,這個條件可能已經滿足了。
序列化:
XmlSerializer xs = new XmlSerializer(typeof(List));
xs.Serialize(fs, listPers);
反序列化:
XmlSerializer xs = new XmlSerializer(typeof(List));
List list = xs.Deserialize(fs) as List;