-
概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
-
方法一(利用反射实现)
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 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序列化和反序列化实现)
?1 2 3 4 5 6 7 8 9 10 11 12 13 public
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;
}
-
(二)(利用二进制序列化和反序列实现)
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public
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实现)
?
1 2 3 4 5 6 7 8 9 10 11 12 13 //利用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
标签:12,obj,MemoryStream,哪些,C#,ms,new,拷贝,retval From: https://www.cnblogs.com/mq0036/p/16981242.html