C#深拷贝方法

  • 概述

 

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

  • 方法一(利用反射实现)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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序列化和反序列化实现)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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;
    }

     

  • 方法三(利用二进制序列化和反序列实现)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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实现)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //利用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;<br>}

      



__EOF__

本文作者Denny.Qi
本文链接https://www.cnblogs.com/Denny-Qi/p/16976867.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Denny·Qi  阅读(469)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示