利用序列化和反序列化实现深拷贝
三.25, 2009 in
.NET
假如说有一个简单的类,只有2个属性,那么可以用比较简单的方法实现深拷贝。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [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; } } |
代码中的DeepCopyPerson对象就是对PersonOne对象的一个深拷贝。其实还可以用序列化和反序列化的方法来实现对对象的深拷贝。Person类的[Serializable]属性是为了下面介绍序列化反序列化方法做深拷贝而做的准备,在这里没什么特别含义。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } </t> |
用的时候就是:
1 2 3 4 5 6 7 8 9 10 11 | class Program { static void Main(string[] args) { //实例化一个对象 Person PersonOne = new Person(); PersonOne.FirstName = "John"; PersonOne.Height = 1; //深拷贝 Person DeepCopyPerson = DeepCopy<person>(PersonOne); } } </person> |
只要一个类被声明为可序列化的(就是带有[Serializable]标签),就可以用这个方法来进行深拷贝。记下来,免得以后自己忘记了。
Related posts:

Leave a Reply