假如说有一个简单的类,只有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]标签),就可以用这个方法来进行深拷贝。记下来,免得以后自己忘记了。

Share and Enjoy:
  • RSS
  • Google Bookmarks
  • Digg
  • del.icio.us
  • Facebook
  • 豆瓣
  • 豆瓣九点
  • FriendFeed
  • LinkedIn
  • Live
  • Ping.fm
  • QQ书签
  • Twitter

Related posts:

  1. PEX-.NET自动化白盒测试工具的介绍(1)
  2. LINQ查询操作中的类型关系
  3. 用XSD自动生成XML对应的.NET实体类
  4. 在C#单元测试中使用HttpContext的简单解决办法
  5. 在测试项目中应用Pex的经验分享