首页 > 编程语言 >C#深拷贝有哪些方法实现

C#深拷贝有哪些方法实现

时间:2022-12-14 09:33:05浏览次数:55  
标签:12 obj MemoryStream 哪些 C# ms new 拷贝 retval

  • 概述

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

标签:12,obj,MemoryStream,哪些,C#,ms,new,拷贝,retval
From: https://www.cnblogs.com/mq0036/p/16981242.html

相关文章

  • CommunityToolkit.Mvvm
    publicclassViewModel:ObservableObject{publicViewModel(){ShowCommand=newRelayCommand<string>(Show);}......
  • Docker 安装,常用命令
    安装Docker官方所有操作系统安装教程:InstallDockerEngineonCentOS|DockerDocumentation,其中CentOS安装docker引擎的代码:安装yum-utils,配置库的地址sudoyuminst......
  • Rocky9 在 VMware Workstation 17 Pro 上的安装
    本篇随笔仅记录Rocky9的安装。  镜像下载链接:https://rockylinux.org/download 我选择的版本如图: 我给的配置(本人笔记本CPU是8核16线程,内存32G,给的这个配置......
  • SQL_8_TCL语句
    TCL指的是事务控制语句。  1、事务概论:指一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。特性:原子性:它是数据库中最小执行......
  • 想要将CADz轴归零?快来试试这几个办法!
    CAD平面图设计过程中,如果有Z坐标可能会带来一系列问题,例如:CAD查询距离不准确,无法倒圆角,无法延伸、无法裁剪……怎么才能将CADz轴归零?本文以浩辰CAD软件为例给大家分享几个......
  • CAD怎么画三维图?通过3D魔方设计实例教会你CAD三维建模!
    CAD怎么画三维图?作为一款研发创新型工业软件,浩辰CAD不仅可以快速、精确地绘制各种二维工程图纸,还可以辅助设计师高效完成3D建模。尤其是在2022版本,浩辰CAD对于3D设计模块做......
  • Spring Cloud架构流程简介
    相对于传统的单体架构,微服务架构引入了太多的概念,让新手有点无可适从。所以,我们要清楚哪些是自身需要的。下面我们分析一下哪些组件是开发一个使用微服务架构的系统所必需......
  • CAD坐标显示不全?无法精准捕捉?你遇到过这些CAD坐标问题吗?
    有些小伙伴在用浩辰CAD看图王查看图纸的过程中,发现会有图纸中CAD坐标显示不全、坐标显示结果和之前不一样以及不能精准捕捉坐标等情况发生,这是为什么呢?本文小编教大家如何......
  • Spring Cloud版本说明和Spring Boot版本选择
    SpringCloud是一个由众多独立子项目组成的大型综合项目,每个子项目有不同的发行节奏,都维护着自己的发布版本号。 SpringCloud通过一个资源清单(BillofMaterial,BOM)来管......
  • 2022-12-14 Excel中图片的批量提取
    Excel中图片的批量提取:全选原表中的所有内容,复制。在桌面新建一个Excel文件,把复制的内容粘贴到文件中,保存并关闭。将新建的Excel文件右键【重命名】,后缀名改为.zip然......