首页 新闻 会员 周边

深度复制问题..当对象成员有很多引用成员,如何深度复制。

0
悬赏园豆:5 [已解决问题] 解决于 2012-11-27 18:23

自定义的类:

public  myRequest

{

 HttpWebRequest request=null; 

 

//其他代码省略

}

 

向实现  myrequest 的深度复制。

 

也就是 对成员request可以深度复制。  因为 HttpWebRequest 是net 自带的对象,它的成员有很多是对象。。

 

所以如何保证 HttpWebRequest 全部深度复制到

水墨.MR.H的主页 水墨.MR.H | 菜鸟二级 | 园豆:280
提问于:2012-08-06 17:08
< >
分享
最佳答案
0

c#通用deep copy:

public static T DeepClone<T>(T obj)
{
    using (var ms = new MemoryStream())
    {
         var formatter = new BinaryFormatter();
         formatter.Serialize(ms, obj);
         ms.Position = 0;

         return (T) formatter.Deserialize(ms);
     }
}
收获园豆:5
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-08-06 17:12

你可以做成一个扩展方法,这样很容易对任何对象进行deep clone。另外,用于deep copy的对象必须是[Serializable]的

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-08-06 17:15

@dudu: 我这个答案是以代码结尾的,刚才我想修改它,在代码之后加点非代码的话,ms是件很麻烦的事情。。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-08-06 17:16

@水牛刀刀: 这个是通用的?

水墨.MR.H | 园豆:280 (菜鸟二级) | 2012-08-06 17:44

@水牛刀刀: 序列化? MS msdn 里面的 clone() 这个方法可以实现吗

水墨.MR.H | 园豆:280 (菜鸟二级) | 2012-08-06 17:45

@水墨.MR.H: 你试试我说的方法吧。。。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-08-06 18:32

@水牛刀刀: 序列化的方法当然可以。但是我想知道通过 MSDN 上的ICloneable 接口实现clone()方法如何实现 深度复制

水墨.MR.H | 园豆:280 (菜鸟二级) | 2012-08-06 19:26

@水墨.MR.H: 不建议使用IClonable接口,因为这个接口名字无法让调用者意识到是深复制还是浅复制。并且,就算你用这个接口,具体实现依然可以用上面我提供的那个方法(当你自己写一个类的时候)。再退一步,你并不能修改HttpWebRequest类的代码,因此你说“通过IClonable接口实现“这种说法是不对的,也是不可行的。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-08-06 23:17
其他回答(3)
0

没法复制。如果你能理解它跟NetworkStream,HttpWebResponse有关系的话,你应该会放弃这种做法。

你应该反问自己,你为什么想要对它做深度复制?

Launcher | 园豆:45045 (高人七级) | 2012-08-06 17:14

也许他只是想获取另外一个一模一样的实例对象,两者之间的修改不互相影响。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-08-06 17:18

想获取另外一个一模一样的实例对象,两者之间的修改不互相影响

支持(0) 反对(0) 水墨.MR.H | 园豆:280 (菜鸟二级) | 2012-08-06 17:43

@水墨.MR.H: 为什么想要获取另外一个一模一样的实例对象?哪些是相同的?哪些是不同的?建议你封装一个 CreateHttpWebRequest 方法来创建“一模一样”的HttpWebRequest实例。我猜测顶多也就是url相同,代理相同,网络凭据相同,而不会涉及到同一个RequestStream之类的I/O类。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2012-08-06 17:51
0

序列化和反序列化是个很不错的选择啊。

chenping2008 | 园豆:9836 (大侠五级) | 2012-08-06 17:23

想获取另外一个一模一样的实例对象,两者之间的修改不互相影响

支持(0) 反对(0) 水墨.MR.H | 园豆:280 (菜鸟二级) | 2012-08-06 17:43

@水墨.MR.H: 序列化就是满足你的要求的

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-08-06 18:50
0

1.自定义方法,手动写每一个对象的复制。

2.利用反射

3.序列化

4.流

中文代码 | 园豆:951 (小虾三级) | 2012-08-07 08:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册