C#深拷贝有哪些方法实现
-
概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
-
方法一(利用反射实现)
1234567891011121314publicstaticT DeepCopy<T>(T obj){//如果是字符串或值类型则直接返回if(objisstring|| obj.GetType().IsValueType)returnobj;objectretval = Activator.CreateInstance(obj.GetType());FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);foreach(FieldInfo fieldinfields){try{ field.SetValue(retval, DeepCopy(field.GetValue(obj))); }catch{ }}return(T)retval;}方法二(利用序列化和反序列化实现)
-
(一)(利用XML序列化和反序列化实现)
12345678910111213publicT DeepCopy<T>(T obj){objectretval;using(MemoryStream ms =newMemoryStream()){XmlSerializer xml =newXmlSerializer(typeof(T));xml.Serialize(ms, obj);ms.Seek(0, SeekOrigin.Begin);retval = xml.Deserialize(ms);ms.Close();}return(T)retval;} -
(二)(利用二进制序列化和反序列实现)
123456789101112131415publicstaticT DeepCopy<T>(T obj){objectretval;using(MemoryStream ms =newMemoryStream()){BinaryFormatter bf =newBinaryFormatter();//序列化成流bf.Serialize(ms, obj);ms.Seek(0, SeekOrigin.Begin);//反序列化成对象retval = bf.Deserialize(ms);ms.Close();}return(T)retval;} - (三)(DataContractSerializer实现)
12345678910111213
//利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用publicstaticT DeepCopy<T>(T obj){objectretval;using(MemoryStream ms =newMemoryStream()){DataContractSerializer ser =newDataContractSerializer(typeof(T));ser.WriteObject(ms, obj);ms.Seek(0, SeekOrigin.Begin);retval = ser.ReadObject(ms);ms.Close();}return(T)retval;<br>}
出处:https://www.cnblogs.com/Denny-Qi/archive/2022/12/12/16976867.html
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。(●'◡'●)
因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/16981242.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
浙公网安备 33010602011771号