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 婆婆高寿祝福语大全简短