使用序列化和反序列化机制深度复制对象

由于值类型和引用类型在赋值上的不同。在Clone一个对象的引用类型的成员时,一般只是简单的赋值对对象的引用。此时原有的对象和新赋值的对象会同时引用同一个成员对象。这种对象Clone的方法一般称为浅赋值或浅表复制。在大多数情况下浅赋值并不是我们希望的Clone方式。

为了实现深度复制,我们就必须遍历有相互引用的对象构成的图,并需要处理其中的循环引用结构。这无疑是十分复杂的。幸好借助.Net的序列化和反序列化机制,可以十分简单的深度Clone一个对象。原理很简单,首先将对象序列化到内存流中,此时对象和对象引用的所用对象的状态都被保存到内存中。.Net的序列化机制会自动处理循环引用的情况。然后将内存流中的状态信息反序列化到一个新的对象中。这样一个对象的深度复制就完成了。

下面是代码:

 

 1  public   static   object  Clone( object  obj)
 2  {
 3       if ( ! obj.GetType().IsSerializable)
 4      {
 5           throw   new  ArgumentException( " 对象不是可序列化的。 " );
 6      }
 7 
 8      IFormatter format  =   new  BinaryFormatter();
 9       using  (Stream stream  =   new  MemoryStream())
10      {
11          format.Serialize(stream, obj);
12          stream.Seek( 0 , SeekOrigin.Begin);
13 
14           return  format.Deserialize(stream);
15      }
16      
17  }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值