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


序列化又稱串行化,是.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<Peoson>));
xs.Serialize(fs, listPers);
反序列化:
XmlSerializer xs = new XmlSerializer(typeof(List<Peoson>));
List<Peoson> list = xs.Deserialize(fs) as List<Peoson>;


免責聲明!

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



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