Denny-Qi
  • 概述

 

  为什么要用到深拷贝呢?比如我们建了某个类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;
    }

      


分类:

技术点:

相关文章:

  • 2022-01-11
  • 2022-12-23
  • 2021-10-06
  • 2021-05-21
  • 2022-01-16
  • 2021-11-06
  • 2021-07-22
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2021-08-07
  • 2021-08-05
相关资源
相似解决方案