C#中4种深拷贝方法介绍
1:利用反射实现
publicstaticTDeepCopy<T>(Tobj)
{
//如果是字符串或值类型则直接返回
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(FieldInfofieldinfields)
{
try{field.SetValue(retval,DeepCopy(field.GetValue(obj)));}
catch{}
}
return(T)retval;
}
2:利用xml序列化和反序列化实现
publicTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
XmlSerializerxml=newXmlSerializer(typeof(T));
xml.Serialize(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
retval=xml.Deserialize(ms);
ms.Close();
}
return(T)retval;
}
3:利用二进制序列化和反序列化实现
publicstaticTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
BinaryFormatterbf=newBinaryFormatter();
//序列化成流
bf.Serialize(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
//反序列化成对象
retval=bf.Deserialize(ms);
ms.Close();
}
return(T)retval;
}
4:利用silverlightDataContractSerializer实现,用于在silverlight客户端使用
publicstaticTDeepCopy<T>(Tobj)
{
objectretval;
using(MemoryStreamms=newMemoryStream())
{
DataContractSerializerser=newDataContractSerializer(typeof(T));
ser.WriteObject(ms,obj);
ms.Seek(0,SeekOrigin.Begin);
retval=ser.ReadObject(ms);
ms.Close();
}
return(T)retval;
补充:第一个已经通过递归实现了深拷贝。
热门推荐
10 五一公司放假祝福语简短
11 追星女孩的祝福语简短
12 给长辈端午祝福语 简短
13 生日祝福语有诗意简短
14 团圆日祝福语简短
15 中秋商务祝福语简短最新
16 温暖文艺简短祝福语短句
17 男孩上学祝福语简短的
18 入住酒店文案祝福语简短