• 概述

  为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。

  • 方法一(利用反射实现)

    public static T DeepCopy<T>(T obj)
    {
    //如果是字符串或值类型则直接返回
    if (obj is string || obj.GetType().IsValueType) return obj; object retval = Activator.CreateInstance(obj.GetType());
    FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
    foreach (FieldInfo field in fields)
    {
    try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }
    catch { }
    }
    return (T)retval;
    }
  • 方法二(利用XML序列化和反序列化实现)

    public T DeepCopy<T>(T obj)
    {
    object retval;
    using (MemoryStream ms = new MemoryStream())
    {
    XmlSerializer xml = new XmlSerializer(typeof(T));
    xml.Serialize(ms, obj);
    ms.Seek(0, SeekOrigin.Begin);
    retval = xml.Deserialize(ms);
    ms.Close();
    }
    return (T)retval;
    }
  • 方法三(利用二进制序列化和反序列实现)

    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;
    } 
  • 方法四(DataContractSerializer实现)
    //利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用
    public static T DeepCopy<T>(T obj)
    {
    object retval;
    using (MemoryStream ms = new MemoryStream())
    {
    DataContractSerializer ser = new DataContractSerializer(typeof(T));
    ser.WriteObject(ms, obj);
    ms.Seek(0, SeekOrigin.Begin);
    retval = ser.ReadObject(ms);
    ms.Close();
    }
    return (T)retval;

      


最新文章

  1. JSP脚本中的9个内置对象
  2. boot from volume
  3. javascript Date 总结
  4. Android数据存储(一)----SharedPreferences详解
  5. [转]通过继承ConfigurationSection,在web.config中增加自定义配置
  6. Jquery手册
  7. OC 实例变量(instance var)与属性(@property)的关系 isa指针
  8. 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
  9. [USACO1.2.2]方块转换 Transformations
  10. Java中double类型的数据精确到小数点后两位
  11. poj 1469(二分图 最大匹配)
  12. shell中的条件表达式
  13. 1.9 From Native to HTML5
  14. H5 video标签的第二种格式
  15. .net 多态
  16. ASP.NET新增数据返回自增ID
  17. 6月3 Smarty基础读取配置
  18. Nginx安装 默认虚拟主机 Nginx用户认证 Nginx域名重定向
  19. 使用API失效供应商地址Demo(转)
  20. windows 下python导入excel

热门文章

  1. Elasticsearch部署清单---前期准备工作
  2. 迁移一个仓库到新的Gitlab
  3. 项目的依赖包(node_modules)删除
  4. 【Linux】指令学习
  5. python中的多线程与多进程
  6. gitee仓库上传文件的步骤
  7. JS前端防止F12扒取源码
  8. 记一个深层的bug
  9. 齐博X1-栏目的调用2
  10. Linux进程间通信(二)