C#深拷贝方法
- 概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
- 方法一(利用反射实现)
1234567891011121314
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;
}
-
方法二(利用XML序列化和反序列化实现)
12345678910111213public
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;
}
-
方法三(利用二进制序列化和反序列实现)
123456789101112131415public
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;
}
- 方法四(DataContractSerializer实现)
12345678910111213
//利用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;<br>}
__EOF__

本文作者:Denny.Qi
本文链接:https://www.cnblogs.com/Denny-Qi/p/16976867.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/Denny-Qi/p/16976867.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)