C#实现深度拷贝的几种实现方法

对象拷贝分为浅拷贝和深度拷贝,都是将对象中的所有字段复制到新的副本对象中;浅拷贝对于值类型和引用类型的方式是有区别的,对于引用类型,如果修改副本中的对象,同时源对象也会随之修改,有时这种操作是不符合预期的;但是深度拷贝不会出现这种情况,副本对象和源对象是两个独立的对象;

一,使用二进制的序列化和反序列化实现(在需要序列化的类加上[Serializable])

public T DeepCopy<T>(T obj)
    {
        using MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream ,obj);
        memoryStream.Seek(0, SeekOrigin.Begin);
        var t = (T)binaryFormatter.Deserialize(memoryStream);
        return t;
    }

二,使用序列化和反序列化实现(在需要序列化的类加上[Serializable])

public T DeepCopy2<T>(T obj)
    {
        return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj));
    }
public T DeepCopy3<T>(T obj)
    {
        return JsonUtility.FromJson<T>(JsonUtility.ToJson(obj));
    }

三,使用XML序列化和发序列化实现

public T DeepCopy4<T>(T obj)
    {
        using MemoryStream memoryStream = new MemoryStream();
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        xmlSerializer.Serialize(memoryStream ,obj);
        memoryStream.Seek(0, SeekOrigin.Begin);
        return (T)xmlSerializer.Deserialize(memoryStream);
    }

四,利用反射(Reflection)实现

public T DeepCopy<T>(T obj)
    {
        if (obj is string || typeof(T).IsValueType)
        {
            return obj;
        }

        var instance = Activator.CreateInstance(obj.GetType());
        FieldInfo[] fieldInfos = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
        foreach (var item in fieldInfos)
        {
            try
            {
                item.SetValue(instance, DeepCopy(item.GetValue(obj)));
            }
            catch (Exception e) { }
        }

        return (T)instance;
    }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值