对于一般情况而言,为了解决引用类型的值对象复制可以巧妙的使用序列化来实现,但是如果牵扯的成员中有一些诸如画刷等系统程序集里的未加序列化特性标识的对象,就很难解决 !
//集合深度复制
public object Clone(object myItem)
{
using(MemoryStream stream = new MemoryStream())
{
object CloneObj=null;
//二进制序列化
BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext
(StreamingContextStates.Clone));
Formatter.Serialize(stream, myItem);
stream.Position = 0;
CloneObj = Formatter.Deserialize(stream);
//Xml序列化
XmlSerializer xml = new XmlSerializer(myItem.GetType());
xml.Serialize(stream, myItem);
stream.Position = 0;
CloneObj = xml.Deserialize(stream);
//Byte[] 序列化
XmlSerializer xml = new XmlSerializer(myItem.GetType());
CloneObj = DeserializeObject(SerializeObject(myItem));
stream.Close();
return CloneObj;
}
}
/// <summary>
/// 把对象序列化并返回相应的字节
/// </summary>
/// <param name="pObj">需要序列化的对象</param>
/// <returns>byte[]</returns>
public byte[] SerializeObject(object pObj)
{
if (pObj == null)return null;
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, pObj);
stream.Position = 0;
byte[] read = new byte[stream.Length];
stream.Read(read, 0, read.Length);
stream.Close();
return read;
}
}
/// <summary>
/// 把字节反序列化成相应的对象
/// </summary>
/// <param name="pBytes">字节流</param>
/// <returns>object</returns>
public object DeserializeObject(byte[] pBytes)
{
if (pBytes == null) return null;
object Obj = null;
using (MemoryStream stream = new MemoryStream(pBytes))
{
stream.Position = 0;
BinaryFormatter formatter = new BinaryFormatter();
Obj = formatter.Deserialize(stream);
stream.Close();
}
return Obj;
}