原理,采用二进制序列化将对象序列化为MemoryStream,再从MemoryStream反序列化为对象。
如下,
public Bitmap DeepClone(Bitmap bitmap)
{
Bitmap dstBitmap = null;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, bitmap);
mStream.Seek(0, SeekOrigin.Begin);//指定当前流的位置为流的开头。
dstBitmap = (Bitmap)bf.Deserialize(mStream);
mStream.Close();
}
return dstBitmap;
}
可以以扩展方法的方式来写深拷贝的函数,个人比较喜欢的方式。如下
public static Bitmap DeepClone(this Bitmap bitmap)
{
Bitmap dstBitmap = null;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, bitmap);
mStream.Seek(0, SeekOrigin.Begin);
dstBitmap = (Bitmap)bf.Deserialize(mStream);
mStream.Close();
}
return dstBitmap;
}
使用时直接:bit.DeepClone();即可。
其他对象与此类似,如DataTable
public static class GlobalFunctionEx
{
public static Bitmap DeepClone(this Bitmap bitmap)
{
Bitmap dstBitmap = null;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, bitmap);
mStream.Seek(0, SeekOrigin.Begin);
dstBitmap = (Bitmap)bf.Deserialize(mStream);
mStream.Close();
}
return dstBitmap;
}
public static DataTable DeelClone(this DataTable DataTable)
{
DataTable dtNew = null;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, DataTable);
mStream.Seek(0, SeekOrigin.Begin);
dtNew = (DataTable)bf.Deserialize(mStream);
mStream.Close();
}
return dtNew;
}
}