概述
為什么要用到深拷貝呢?比如我們建了某個類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;