济南卓远网站建设公司,个人主页网站开发背景,南京做网站建设的公司哪家好,二级域名ip查询概述为什么要用到深拷贝呢#xff1f;比如我们建了某个类Person#xff0c;并且实例化出一个对象#xff0c;然后#xff0c;突然需要把这个对象复制一遍#xff0c;并且复制出来的对象要跟之前的一模一样#xff0c;来看下我们一般会怎么做。1、利用反射实现public stat…概述 为什么要用到深拷贝呢比如我们建了某个类Person并且实例化出一个对象然后突然需要把这个对象复制一遍并且复制出来的对象要跟之前的一模一样来看下我们一般会怎么做。1、利用反射实现public static T DeepCopyT(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 DeepCopyT(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 DeepCopyT(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 DeepCopyT(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;