Board logo

標題: [分享] C# 物件序列化與反序列化 [打印本頁]

作者: Luc    時間: 2010-8-17 23:58     標題: C# 物件序列化與反序列化

C#的物件序列化可將執行時期的物件狀態輸出至stream。本文介紹使用BinaryFormatter的方法。
使用BinaryFormatter需引用下列命名空間:
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

要保存狀態的類別定義需要標記[Serializable]屬性,例如一個簡單的類別宣告如下:
    [Serializable]
    class MyContact
    {
        public string name;
        public int age;
        
        public MyContact(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
    }

將執行個體的狀態保存成檔案:
    MyContact data = new MyContact("John", 14);
    IFormatter fmt = new BinaryFormatter();
    Stream ostream = new FileStream("MyData.binary", FileMode.Create, FileAccess.Write, FileShare.None);
    fmt.Serialize(ostream, data);
    ostream.Close();
這邊使用了FileStream(引用System.IO)。
方法同樣適用於Stream的衍生類別。
作者: Luc    時間: 2010-8-18 00:03

使用同樣的類別宣告,從檔案反序列化:

    Stream istream = new FileStream("MyData.binary", FileMode.Open,
        FileAccess.Read, FileShare.Read);
    MyContact data = (MyContact)fmt.Deserialize(istream);
    istream.Close();
   
    // data.name = ??
作者: Luc    時間: 2010-8-18 00:45

另一種方法是將物件序列化成XML的格式,使用XmlSerializer。(引用System.Xml.Serialization命名空間)

    MyContact data = new MyContact("John", 14);
    XmlSerializer fmt = new XmlSerializer(typeof(MyContact));
    Stream ostream = new FileStream("MyData.xml", FileMode.Create, FileAccess.Write, FileShare.None);
    fmt.Serialize(ostream, data);
    ostream.Close();

與BinaryFormatter比較一下,差別只在用來序列化的類別不同。
用這種方法要注意存取修飾子及提供預設建構子。這個例子會產生這樣的輸出結果:
<?xml version="1.0"?>
<MyContact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name>John</name>
  <age>14</age>
</MyContact>




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)