C#中实现对象的深拷贝
2023-09-11 14:21:58 时间
C#中实现对象的深拷贝
深度拷贝指的是将一个引用类型(包含该类型里的引用类型)拷贝一份(在内存中完完全全是两个对象,没有任何引用关系).......... 直接上代码:
1 /// <summary> 2 /// 对象的深度拷贝(序列化的方式) 3 /// </summary> 4 public static class MyDeepCopy 5 { 6 7 /// <summary> 8 /// xml序列化的方式实现深拷贝 9 /// </summary> 10 /// <typeparam name="T"></typeparam> 11 /// <param name="t"></param> 12 /// <returns></returns> 13 public static T XmlDeepCopy<T>(T t) 14 { 15 //创建Xml序列化对象 16 XmlSerializer xml = new XmlSerializer(typeof(T)); 17 using (MemoryStream ms = new MemoryStream())//创建内存流 18 { 19 //将对象序列化到内存中 20 xml.Serialize(ms, t); 21 ms.Position = default;//将内存流的位置设为0 22 return (T)xml.Deserialize(ms);//继续反序列化 23 } 24 } 25 26 /// <summary> 27 /// 二进制序列化的方式进行深拷贝 28 /// 确保需要拷贝的类里的所有成员已经标记为 [Serializable] 如果没有加该特性特报错 29 /// </summary> 30 /// <typeparam name="T"></typeparam> 31 /// <param name="t"></param> 32 /// <returns></returns> 33 public static T BinaryDeepCopy<T>(T t) 34 { 35 //创建二进制序列化对象 36 BinaryFormatter bf = new BinaryFormatter(); 37 using (MemoryStream ms = new MemoryStream())//创建内存流 38 { 39 //将对象序列化到内存中 40 bf.Serialize(ms, t); 41 ms.Position = default;//将内存流的位置设为0 42 return (T)bf.Deserialize(ms);//继续反序列化 43 } 44 } 45 }
浅拷贝指的是将该类型里面的值类型拷贝,而该类型里的引用类型不进行拷贝,实现浅拷贝很简单,再该类里编写一个方法,方法内部调用自身的MemberwiseClone()方法即可得到一个object类型的对象,将它强转成当前对象返回即可,列如:
1 public class Person 2 { 3 public int ID { get; set; } 4 public string Name { get; set; } 5 public string Email { get; set; } 6 public Cat Cat { get; set; } 7 8 /// <summary> 9 /// Person类的浅拷贝 10 /// </summary> 11 /// <returns></returns> 12 public Person QainClone() 13 { 14 //调用自带的浅拷贝方法得到的是一个objec类型的对象,然后强转直接返回就可以了 15 return MemberwiseClone() as Person; 16 } 17 }
string是个列外
相关文章
- C#中Monitor对象与Lock关键字的区别分析
- C#订阅与发布标准实现 visual studio code .net 开发 设计模式之☞策略模式 C#字符串转二进制、二进制转字符串 c# 接口的协变和逆变 c# 使用迭代器来创建可枚举类型 博客园首页新随笔联系订阅管理 随笔 - 117 文章 - 0 评论 - 57 c# 创建,加载,修改XML文档
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C#【中级篇】C# 字符串(String)
- C#【必备技能篇】不安全代码(unsafe)的使用
- 解决WinForm(C#)中MDI子窗体最大化的问题
- c#中使用XSLT将xml文档转换为html文档方法
- C#中使用MD5对用户密码加密与解密
- c#中如何实现拷贝对象
- C# Remoting 简单实现
- C#对象XML序列化(一):序列化方法和常用特性
- C# 中对控件实例化仍然“未将对象引用设置到对象的实例”的解决办法
- 【转发】C# Entity Framework框架 Code First 模式 连接 SQLAccessSQLite (组合式)
- C#控件datagridview的表头填入tag对象,再获取出来
- c# Winform DataGridView 当前单元格失去焦点的有关问题
- 对Java、C#转学swift的提醒:学习swift首先要突破心理障碍。
- C# - var 匿名对象属性的赋值与取值
- 谈谈C#文件监控对象FileSystemWatcher使用感受
- C# SqlBulkCopy