概念:序列化是指將對象實例的狀態存儲到存儲媒體的過程。在此過程中,先將對象的公共字段和私有字段以及類的名稱(包括類所在的程序集)轉換為字節流,然後再把字節流寫入數據流。在隨後對對象進行反序列化時,將創建出與原對象完全相同的副本。
序列化的理解:保留信息,便於不同機器,不同作用的應用程序取出調用。
他先把對象弄成流然後進行保存,反序列化就是恢復原來的信息。
這個也可以應用到不同的程序域
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了