有关序列化实现引用对象深度复制的几种方法 !

本文介绍了一种通过序列化实现对象深拷贝的方法,并提供了三种不同的序列化方式:二进制序列化、XML序列化和基于Byte数组的序列化。这些方法能够有效地解决对象及其引用类型成员的复制问题。

       

对于一般情况而言,为了解决引用类型的值对象复制可以巧妙的使用序列化来实现,但是如果牵扯的成员中有一些诸如画刷等系统程序集里的未加序列化特性标识的对象,就很难解决 !

 

        //集合深度复制
        public object Clone(object myItem)
        {
            using(MemoryStream stream = new MemoryStream())
            {
                object CloneObj=null;

               

                //二进制序列化
                BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext 

                (StreamingContextStates.Clone));
                Formatter.Serialize(stream, myItem);
                stream.Position = 0;
                CloneObj = Formatter.Deserialize(stream);

               

               //Xml序列化
                XmlSerializer xml = new XmlSerializer(myItem.GetType());
                xml.Serialize(stream, myItem);
                stream.Position = 0;
                CloneObj = xml.Deserialize(stream);

               

               //Byte[] 序列化
                XmlSerializer xml = new XmlSerializer(myItem.GetType());
                CloneObj = DeserializeObject(SerializeObject(myItem));

                stream.Close();


                return CloneObj;
            }
        }  

 

        /// <summary>
        /// 把对象序列化并返回相应的字节
        /// </summary>
        /// <param name="pObj">需要序列化的对象</param>
        /// <returns>byte[]</returns>
        public byte[] SerializeObject(object pObj)
        {
            if (pObj == null)return null;
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, pObj);
                stream.Position = 0;
                byte[] read = new byte[stream.Length];
                stream.Read(read, 0, read.Length);
                stream.Close();
                return read;
            }        
        }


        /// <summary>
        /// 把字节反序列化成相应的对象
        /// </summary>
        /// <param name="pBytes">字节流</param>
        /// <returns>object</returns>
        public object DeserializeObject(byte[] pBytes)
        {
            if (pBytes == null) return null;
            object Obj = null;
           
            using (MemoryStream stream = new MemoryStream(pBytes))
            {
                stream.Position = 0;
                BinaryFormatter formatter = new BinaryFormatter();
                Obj = formatter.Deserialize(stream);
                stream.Close();
            }
            return Obj;
        }

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值