如何实现对象的深copy?

咨询区

  • NakedBrunch

我的项目中有一个对象copy的需求,比如下面这段代码:


MyObject myObj = GetMyObj(); // Create and fill a new object
MyObject newObj = myObj.Clone();

这段代码有一点问题,那就是对 newobj 进行的任何修改都会作用到 myobj 上,我不想这样,我想实现那种深copy,我目前的做法是重新new一个对象,然后逐一将老对象的属性赋值给新对象,虽然是可以实现,但我觉得应该有更简单方便的做法?

回答区

  • Michael Cox

如果你不介意使用第三方工具,可以参考下  ValueInjecterAutoMapper,它可以完美的实现你的需求,参考如下代码:


MyObject oldObj; // The existing object to cloneMyObject newObj = new MyObject();newObj.InjectFrom(oldObj); // Using ValueInjecter syntax

用这些第三方工具,你就不需要像传统那样copy了,也避免了 model 需实现 ISerializable 或 ICloneable  接口的尴尬,其实这是 MVC/MVVM 开发模式下的 DTO 通用做法。

  • johnc

你可以使用 JSON.NET 去实现,它可以非常轻量级的实现,不需要让你的类打上[Serializable]标记,参考如下代码:


public static T CloneJson<T>(this T source)
{            // Don't serialize a null object, simply return the default for that objectif (ReferenceEquals(source, null)) return default;var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}
  • Michael White

我也碰到了这种问题,我觉得序列化是一条路,这里我把它序列化为xml,参考如下:


static public class SerializeHelper
{public static T DeserializeXML<T>(string xmlData) where T:new(){if (string.IsNullOrEmpty(xmlData))return default(T);TextReader tr = new StringReader(xmlData);T DocItms = new T();XmlSerializer xms = new XmlSerializer(DocItms.GetType());DocItms = (T)xms.Deserialize(tr);return DocItms == null ? default(T) : DocItms;}public static string SeralizeObjectToXML<T>(T xmlObject){StringBuilder sbTR = new StringBuilder();XmlSerializer xmsTR = new XmlSerializer(xmlObject.GetType());XmlWriterSettings xwsTR = new XmlWriterSettings();XmlWriter xmwTR = XmlWriter.Create(sbTR, xwsTR);xmsTR.Serialize(xmwTR,xmlObject);return sbTR.ToString();}public static T CloneObject<T>(T objClone) where T:new(){string GetString = SerializeHelper.SeralizeObjectToXML<T>(objClone);return SerializeHelper.DeserializeXML<T>(GetString);}
}

点评区

相信深copy在各位项目开发中是必然会遇到的问题,我在很长一段时间内都是使用 JSON.NET 去实现,就像 johnc 大佬提供的代码一样,简单粗暴,同时三位大佬都提供了相应方法,这里学习了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨服务器查询

在执行跨服务器查询之前&#xff0c;运行 exec sp_configure show advanced options,1 reconfigure exec sp_configure Ad Hoc Distributed Queries,1 reconfigure 查询结束后&#xff0c;运行 exec sp_configure Ad Hoc Distributed Queries,0 reconfigure exec sp_configure…

图片裁剪和异步上传插件--一步到位(记录)

图片上传裁剪这功能随处可见&#xff0c;有的自己写&#xff0c;不过太耗费时间了&#xff0c;插件的话感觉好多&#xff0c;前段时间就想挑一款好的插件&#xff0c;以后就用那款&#xff0c;可是挑了几款插件用上去&#xff0c;效果很好&#xff0c;问题就出在合并了&#xf…

git checkout 单个文件_git 如何回退单个文件

1.进入到文件所在文件目录&#xff0c;或者能找到文件的路径查看文件的修改记录git log fileName结果&#xff1a;如果文件修改记录太多&#xff0c;则使用git log -number fileName结果&#xff1a;2.回退到指定版本git reset ** fileName1.git reset -mixed&#xff1a;此为默…

未来十年最吃香专业大盘点,有你的吗?

全世界只有3.14 % 的人关注了爆炸吧知识这个世界上理工科到底有多吃香&#xff1f;如果你是理工男/女&#xff0c;先恭喜一下你&#xff0c;不知道喜从何来&#xff1f;不妨先来看这几组数据&#xff1a;高薪职业平均薪资一览表薪资最高的专业前20名这并不只是中国的情况&#…

mysql挂载到iscsi_corosync+pacemaker+iscsi磁盘实现mysql高可用

实验用主机&#xff1a;提供iscsi磁盘:172.16.103.1,提供iscsi磁盘高可用主机:172.16.103.2&#xff0c;172.16.103.3实验拓扑&#xff1a;实验步骤&#xff1a;一、配置172.16.103.1&#xff0c;输出iscsi磁盘&#xff0c;创建的磁盘分区为/dev/sda3&#xff0c;在实际的使用环…

一种在未来互联网中的面向用户的云操作系统体系

本文描述了一个欲将整个网络当做计算机使用&#xff0c;可以极大增强云计算应用能力和提高用户体验的一个类操作系统体系结构。望有识之士能做下去。 价值1&#xff09;用户的痛苦在哪里&#xff1f;对于终端用户&#xff0c;他们的痛苦在于使用Web应用不方便&#xff0c;可以使…

提高「搜商」,挣大钱

大家好&#xff0c;我是Z哥。在之前的一篇讲述数据分析的文章《这个时代最重要的技能之一》中提到了这周要和大家聊聊「搜商」的事情。搜商这个词诞生于互联网时代&#xff0c;体现的是一个人利用搜索引擎查找自己所需信息的能力。我觉得在当下这个时代&#xff0c;搜商的重要性…

idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置

电脑上已经安装过 JDK 8 版本(C:Javajdk1.8.0_111)。安装好 JDK 11 版本(C:Program FilesJavajdk-11.0.2)之后&#xff0c;目录如下&#xff0c;分别有&#xff1a;安装过程&#xff1a;1. 开始安装 JDK 11&#xff1b;2. 完成安装JDK 11&#xff1b;配置过程&#xff1a;1. 将…

生活随笔:大学需要确立自己的方向

在广大的四年期间&#xff0c;大部分时间都是探索阶段&#xff0c;在那个时候没有师兄帮忙&#xff0c;也没有多少认识带自己入行的人&#xff0c;因为所学的flash都是很冷门。碰了不少钉子之后&#xff0c;发现入行并不容易。每一次面试回来&#xff0c;都是带着伤痕累累回来&…

老师,你和我的文具撞衫了!

全世界只有3.14 % 的人关注了爆炸吧知识来看越南学生拍摄的一组图&#xff0c;主题是老师和文具“撞衫”&#xff01;老师你和我的胶水撞了&#xff01;老师你和我的笔袋撞了&#xff01;老师你和我的手机壳撞了&#xff01;这个铅笔和老师好像啊书皮和老师很像老师今天穿得像面…

中小企业SaaS型软件BI的发展前景

2019独角兽企业重金招聘Python工程师标准>>> 传统企业在实施信息化的过程中&#xff0c;往往遵循着先用ERP把物料管起来&#xff0c;然后再CRM把客户关系管理起来&#xff0c;之后是财务系统&#xff0c;最后才会在数据的压力之下&#xff0c;实 施BI。那么&#xf…

mysql安装配置yum_在CentOS 7下使用yum配置MySQL源并安装MySQL

centos7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是centos7的yum源中默认好像是没有mysql的。为了解决这个问题&#xff0c;我们要先下载mysql的repo源。1.由于centos 的yum源中没有mysql&#xff0c;需要到mysql的官网下载yum repo配置文件。wget http://de…

穿透Session 0 隔离(一)

服务&#xff08;Service&#xff09;对于大家来说一定不会陌生&#xff0c;它是Windows 操作系统重要的组成部分。我们可以把服务想像成一种特殊的应用程序&#xff0c;它随系统的“开启&#xff5e;关闭”而“开始&#xff5e;停止”其工作内容&#xff0c;在这期间无需任何用…

navicat循环执行上下两行相减sql语句_SQL语句的优化分析

一、开门见山&#xff0c;问题所在sql语句性能达不到你的要求&#xff0c;执行效率让你忍无可忍&#xff0c;一般会时下面几种情况。网速不给力&#xff0c;不稳定。服务器内存不够&#xff0c;或者SQL 被分配的内存不够。sql语句设计不合理没有相应的索引&#xff0c;索引不合…

想不到,那些让我半夜偷偷收藏的沙雕表情包,竟是出自AI之手

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;机器之心参与&#xff1a;蛋酱要是收藏夹里没几个独家沙雕表情包&#xff0c;当代网民都无法在朋友圈立足。但有一些「妙不可言」的图片&#xff0c;也许是 AI 生成的结果。一般人很难读出「meme」这个词&#xff0c;它通…

C#基础:理解装箱与拆箱

.NET大牛之路 • 王亮精致码农 • 2021.08.27前面我们讲到 .NET 平台支持的两大数据类型&#xff1a;值类型和引用类型。值类型比引用类型更高效&#xff0c;因为它没有指针引用&#xff0c;不用分配在托管堆中&#xff0c;也不用被 GC 回收。但有时候你可能偶尔需要将一种类型…

什么是SSLP和ISSR?

什么是SSLP和ISSR&#xff1f;简单序列长度多态性&#xff08;simple sequence length polymorphism&#xff0c;SSLP&#xff09;是据串联重复排列微卫星基序两侧的单一序列设计引物&#xff0c;对微卫星序列&#xff08;microsatellite DNA或simple sequence repeats&#xf…

JavaScript中的arguments,callee,caller

2019独角兽企业重金招聘Python工程师标准>>> arguments: arguments 该对象代表正在执行的函数和调用它的函数的参数。 [function.]arguments[n]参数 function&#xff1a;选项。当前正在执行的 Function 对象的名字。 n &#xff1a;选项。要传递给 Function 对象的…

python总结函数图像_PIL使用小结(crop和paste函数)

PIL(Python Imaging Library)是python语言中对图像处理方面的一个开源库&#xff0c;其主要功能模块为Image&#xff0c;对于Image模块&#xff0c;可以使用from PIL import Image或者import Image由于使用了试用版的chartdir库&#xff0c;在生成图片的时候下面会出现一行提示…

js中apply和join

join 分隔符分隔指定数组中的数据,不仅可以分割&#xff0c;还可以考虑用join("")合并&#xff0c;可以将一个array对象数据进行合并 1 <script>2 vark["2","3",4,5];3 alert(k.join(""));4 vars["s",":",,…