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>}

      


 

出处:https://www.cnblogs.com/Denny-Qi/archive/2022/12/12/16976867.html

posted on 2022-12-14 09:22  jack_Meng  阅读(62)  评论(0编辑  收藏  举报

导航