对象序列化

创建一个类:   public class Person 

    {
        //2.建议,在使用序列化的时候尽量避免使用自动属性,因为自动属性,每次编译的时候自动生成的字段名可能不一样,所以在反序列化的时候可能会造成问题。
        private string _name;
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        private int _age;
        public int Age
        {
            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }

2.实例化对象

 Person p = new Person();
           p.Name = "cizon";
           p.Age = 16;

//对象序列化的步骤:
            //1.创建二进制对象序列化器
            BinaryFormatter bf = new BinaryFormatter();

            //创建一个文件流
            using (FileStream fs = new FileStream("person.bin", FileMode.Create))
            {
                //2.开始执行序列化
                //将对象sly,序列化到fs文件流中,最终sly就保存到了person.bin文件中。
                bf.Serialize(fs, sly);
            }
            Console.WriteLine("ok");
            Console.ReadKey();

//Person类型要想被序列化,
    //1.必须Person类型本身是可序列化的(Person类型标记为可序列化)
    //2.类中所有的字段属性的类型也必须标记为可序列化的。
    //3.当前类型的所有父类也必须标记为可序列化的。
    [Serializable]

 

 

 //反序列化步骤:
            //1.创建二进制序列化器(格式化器)
            BinaryFormatter bf = new BinaryFormatter();

            using (FileStream fs = new FileStream("person.bin", FileMode.Open))
            {
                //2.开始执行反序列化
                //在执行反序列化的时候,由于person.bin中是存储的是原来Person类型序列化后的结果,所以要对person.bin反序列化时,需要Person类所在的程序集。

                //问题:为什么反序列化的时候需要原来定义Person类的那个程序集?
                //反序列话的时候,要返回一个对象,这个对象必须根据原来Person所在的程序集才能创建,也就是说person.bin中包含的仅仅是一些数据,根据这些数据是无法在内存中创建对象的。只能是根据原来Person类型的程序集来创建对象,然后把person.bin中的数据一一对应进行赋值。
                //object obj = bf.Deserialize(fs);
                //对象序列化,只是对对象的一些状态信息进行序列化(比如:字段)。
                //对于方法之类的根本不进行序列化,也就是说person.bin中只包含字段名和字段值,根本没有方法信息。但是反序列化的时候,返回的是一个对象,那么只根据这些字段信息是无法创建对象的,所以这个时候需要先根据原来的程序集,获取Person类型,然后在内存中创建一个Person对象,然后再把反序列化得到的字段信息赋值给这个Person对象。

                Person per = (Person)bf.Deserialize(fs);
                Console.WriteLine("Name:{0},Age:{1}per.Name, per.Age);
            }
            Console.WriteLine("ok");
            Console.ReadKey();

        }

转载于:https://www.cnblogs.com/cizon/archive/2012/06/08/2541175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值