利用序列化和反序列化实现深拷贝
假如说有一个简单的类,只有2个属性,那么可以用比较简单的方法实现深拷贝。
[Serializable]
public class Person
{
public int Height { get; set; }
public string FirstName { get; set; }
}
class Program {
static void Main(string[] args) {
//实例化一个对象
Person PersonOne = new Person();
PersonOne.FirstName = "John";
PersonOne.Height = 1;
//深拷贝
Person DeepCopyPerson = new Person();
DeepCopyPerson.FirstName = PersonOne.FirstName;
DeepCopyPerson.Height = PersonOne.Height;
}
}
public class Person
{
public int Height { get; set; }
public string FirstName { get; set; }
}
class Program {
static void Main(string[] args) {
//实例化一个对象
Person PersonOne = new Person();
PersonOne.FirstName = "John";
PersonOne.Height = 1;
//深拷贝
Person DeepCopyPerson = new Person();
DeepCopyPerson.FirstName = PersonOne.FirstName;
DeepCopyPerson.Height = PersonOne.Height;
}
}
代码中的DeepCopyPerson对象就是对PersonOne对象的一个深拷贝。其实还可以用序列化和反序列化的方法来实现对对象的深拷贝。Person类的[Serializable]属性是为了下面介绍序列化反序列化方法做深拷贝而做的准备,在这里没什么特别含义。
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;
}
{
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;
}
用的时候就是:
class Program {
static void Main(string[] args) {
//实例化一个对象
Person PersonOne = new Person();
PersonOne.FirstName = "John";
PersonOne.Height = 1;
//深拷贝
Person DeepCopyPerson = DeepCopy<person>(PersonOne);
}
}
static void Main(string[] args) {
//实例化一个对象
Person PersonOne = new Person();
PersonOne.FirstName = "John";
PersonOne.Height = 1;
//深拷贝
Person DeepCopyPerson = DeepCopy<person>(PersonOne);
}
}

浙公网安备 33010602011771号