C#深拷贝有哪些方法实现
-
概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
-
方法一(利用反射实现)
1234567891011121314public
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>}
出处:https://www.cnblogs.com/Denny-Qi/archive/2022/12/12/16976867.html
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/16981242.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!