C#中4种深拷贝方法介绍

共 2113字,需浏览 5分钟

 ·

2021-05-07 06:55

概述

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

1、利用反射实现

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

2、利用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;    }

3、利用二进制序列化和反序列化实现

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

4、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;



往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报