程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 序列化的學習!

序列化的學習!

編輯:.NET實例教程

概念:序列化是指將對象實例的狀態存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉換為字節流,然後再把字節流寫入數據流。在隨後對對象進行反序列化時,將創建出與原對象完全相同的副本。 
 序列化的理解:保留信息,便於不同機器,不同作用的應用程序取出調用。
他先把對象弄成流然後進行保存,反序列化就是恢復原來的信息。
這個也可以應用到不同的程序域
 BinaryFormatter類存在於System.Runtime.Serialization.Formatters.Binary
以二進制格式將對象或整個連接對象圖形序列化和反序列化。
Serialize序列化一個對象 參數2個第一個是一個流對象,第2個是要序列化的對象
Deserialize反序列化一個對象,參數一個  要被反序列化的流

例子如下
[Serializable]//這裡也用到了反射技術??看來應該好好看反射
public class Book
{
    private string name;
    private float price;//如果不想實力這個的話可以寫這個 [NonSerialized]
    private string author;
    public Book()
 {

  
 }
    public Book(string name, string author, float price)
    {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    public string Name//如果不想實力話這個的話可以在前面加
       
    {
        get { return name; }
        set
        {
            this.name = value;
        }
    }
    public string Author
    {
        get { return author; }
        set { author = value; }
    }
    public float Price
    {
        get { return price; }
        set { price = value; }
 
    }

}

 Book book = new Book("故事大王", "張三", 32);
        using (FileStream fs = new FileStream("c:\\book.dat", FileMode.Create))//這個文件名可以是任意的。

$False$


        {
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(fs, book);
        }
        book = null;
        using (FileStream fs = new FileStream("c:\\book.dat", FileMode.Open))
        {
            BinaryFormatter bf = new BinaryFormatter();
            book = (Book)bf.Deserialize(fs);//這個是反序列化,參數是一個流
            Response.Write(book.Author + "<br>" + book.Name + "<br>" + book.Price);
        }

 

SerializationInfo 類  存儲將對象序列化或反序列化所需的全部數據  在序列化時,使用 AddValue 方法將對象添加到 SerializationInfo 存儲區中;在反序列化時,使用 GetValue 方法從 SerializationInfo 存儲區中提取對象。
StreamingContext 成員  描述給定的序列化流的源和目標
要實現 ISerializable,需要實現 GetObjectData 方法以及一個特殊的構造函數,在反序列化對象時要用到此構造函數
要實現自己的序列化的話 就要繼承接口ISerializable,它允許對象控制其自己的序列化和反序列化過程。
修改後代碼如下
[Serializable]
public class Book:ISerializable
{
    private string name;
    private float price;
    private string author;
    public Book()
    {


    }
    protected Book(SerializationInfo info,StreamingContext strcon) //這個在反序列化的時候要調用
    {
        author = (string)info.GetValue("author", typeof(string));
    }
    //還要實現一個方法 這個方法在序列化的時候要被調用,方法裡面指定你要被序列化的字段等。
    public void GetObjectData(SerializationInfo info, StreamingContext strcon)
    {
        info.AddValue("author", author,author .GetType());

    }
    public Book(string name, string author, float price)
    {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    public string Name
    {
        get { return name; }
        set
        {
            this.name = value;
        }
    }
    public string Author
    {
        get { return author; }
        set { author = value; }
    }
    public float Price
    {
        get { return price; }
        set { price = value; }

    }

}

主函數不變


輸出結果是張三   0  這個price 是double默認是0.0了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved