对象序列化与反序列化 深层拷贝

本文详细介绍了序列化与反序列化的基本概念及其在不同场景的应用,包括使用BinaryFormatter进行对象序列化与反序列化的过程,以及如何实现对象的深层拷贝。同时,文章还提供了相关类定义和代码示例,帮助读者理解和实践序列化技术。

2012年4月11日   天气 有雨   真正的春雨来了,虽然下雨,不像上个月的雨期了,心情不错!

今天看了一下序列化的问题,感觉挺神奇的,代码如下:

        //序列化与反序列化
        //序列化 就是可以 把你建的一个对象有文件保存起来
        //比如说你把建好的list<string>存了很多值,但程序关闭了,值就不存在了,你想用文件保存起来,下次再用
        //或者把你的对象通过socket发给另外一个程序调用
        //反序列化把你序列化的文件流转换成对象,以便调用
        //序列化
        static void simple6_1()
        {
            List<string> list = new List<string>();
            list.Add("zhangfeng is a SB!");
            list.Add("SB have many");
            list.Add("SB is smiling");//新建一list对象 并添加值
            BinaryFormatter fb = new BinaryFormatter();//创建一个序列化对象
            using (FileStream fs = new FileStream("c:\\a.dat",FileMode.Create))
            {
                fb.Serialize(fs, list);//对象序列化
            }
        }
        //反序列化
        static void simple6_2()//在asp.net 中  viewState 和session  可能用到
        {
            BinaryFormatter fb = new BinaryFormatter();
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
            {
                object obj= fb.Deserialize(fs);//对象反序列化
                List<string> list = (List<string>)obj;
                foreach (string s in list)
                {
                    Console.WriteLine(s);//输出
                }
            }
        }
        //复杂序列化
        //复杂在哪呢,就是自建一个对象,对象中一个属性是自己类的对象,序列化一个对象后,怎样保存他指向的对象的值
        //这里面序列化一个对象,其实保存了两个对象的值
        static void simple7_1()
        {
            person p1 = new person();
            p1.ID = 1;
            p1.Name = "老布什";
            p1.Age = 50;

            person p2 = new person();
            p2.ID = 2;
            p2.Name = "小布什";
            p2.Age = 20;
            p2.parent = p1;

            

            BinaryFormatter fb = new BinaryFormatter();//创建一个序列化对象
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Create))
            {
                fb.Serialize(fs, p2);//对象序列化
            }
        }
        static void simple7_2()
        {
            BinaryFormatter fb = new BinaryFormatter();
            using (FileStream fs = new FileStream("c:\\a.dat", FileMode.Open))
            {
                object obj = fb.Deserialize(fs);//对象反序列化
                person p = (person)obj;
                Console.WriteLine(p.parent.Name);//输出老布什
            }
        }
        //对象序列化的应用  深层拷贝
        static object DeepCopy(object src)
        {
            BinaryFormatter bf = new BinaryFormatter(null, new System.Runtime.Serialization.StreamingContext(StreamingContextStates.Clone));
            using (MemoryStream stream = new MemoryStream())
            {
                bf.Serialize(stream, src);
                stream.Position = 0;
                return bf.Deserialize(stream);
            }
        }
        //深层拷贝调用
        //为什么我们要用到深层拷贝,因为有时候建了一个对象  想要更改  又想保存原来的值  普通拷贝  只是浅层拷贝
        static void simple8()
        {
            person p1 = new person();
            p1.ID = 1;
            p1.Name = "老布什";
            p1.Age = 50;

            person p2 = new person();
            p2.ID = 2;
            p2.Name = "小布什";
            p2.Age = 20;
            p2.parent = p1;

            person p = (person)DeepCopy(p2);
            Console.WriteLine(p.parent.Name);//输出老布什
        }

//类定义:

    [Serializable]//标记  标记是可以序列化,不是每个对象都可以序列化的,自写的要标记可序列化
    class person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public person parent { get; set; }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值