概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
1、利用反射实现
public static T DeepCopy<T>(T obj)
{//如果是字符串或值类型则直接返回if (obj is string || obj.GetType().IsValueType) return obj;object retval = Activator.CreateInstance(obj.GetType());FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);foreach (FieldInfo field in fields){try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }catch { }}return (T)retval;
}
2、利用xml序列化和反序列化实现
public T DeepCopy<T>(T obj){object retval;using (MemoryStream ms = new MemoryStream()){XmlSerializer xml = new XmlSerializer(typeof(T));xml.Serialize(ms, obj);ms.Seek(0, SeekOrigin.Begin);retval = xml.Deserialize(ms);ms.Close();}return (T)retval;}
3、利用二进制序列化和反序列化实现
public static T DeepCopy<T>(T obj)
{object retval;using (MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();//序列化成流bf.Serialize(ms, obj);ms.Seek(0, SeekOrigin.Begin);//反序列化成对象retval = bf.Deserialize(ms);ms.Close();}return (T)retval;
}
4、DataContractSerializer实现
利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用
public static T DeepCopy<T>(T obj){object retval;using (MemoryStream ms = new MemoryStream()){DataContractSerializer ser = new DataContractSerializer(typeof(T));ser.WriteObject(ms, obj);ms.Seek(0, SeekOrigin.Begin);retval = ser.ReadObject(ms);ms.Close();}return (T)retval;