概念:序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
序列化的理解:保留信息,便于不同机器,不同作用的应用程序取出调用。
他先把对象弄成流然后进行保存,反序列化就是恢复原来的信息。
这个也可以应用到不同的程序域
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))//这个文件名可以是任意的。
{
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了