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 红包祝福语简短10字
18 周六早晨祝福语简短