Deep Clone 常用方式总结
Deep Clone Example
总结 Deep Clone 一般有如下几种实现方式:
- 纯手工每个类实现赋值 (ps: 不做介绍,一般都不想这么玩)
- 序列化和反序列化
- 纯反射
- emit 或 Expression Tree
下面是本人举了几个样本:
Expression Tree
Expression Tree 和 emit 性能按理论来说应该差距不太大,所以这里只举 Expression Tree
Expression 这个是举例用Expression Tree实现的“伪通用”Deep Clone方法
比如字典,strut,接口等等都没有考虑,只是一个Demo,可以作为大家了解如何实现的一个例子,因为支持考虑少,所以性能最高CloneExtensions 一个也是用Expression Tree实现的Deep Clone库,支持多了很多,但是也有些限制,详情查阅 https://github.com/MarcinJuraszek/CloneExtensions
序列化和反序列化
序列化和反序列化 有很多序列化协议,比如json,xml,Thrift,Protobuf,Avro 等等, https://github.com/eishay/jvm-serializers/wiki 这个是一些比较结果,所以其实用序列化实现Deep Clone 完全依靠对应协议和实现的性能
[ServiceStack json] 这个就是json的一个例子
// Deep Clone 实现
JsonSerializer.DeserializeFromString<T>(JsonSerializer.SerializeToString<T>(obj))
AutoMapper 对象映射库
// Deep Clone 实现
Mapper.Initialize(cfg => cfg.CreateMap<Student, Student>());
var dest = Mapper.Map<Student, Student>(s);
在Release模式下,跑了1000000 次的 Deep Clone 性能测试如下

简陋的测试代码参阅 :https://github.com/fs7744/DeepCloneExample/blob/master/DeepClone/DeepClone/Program.cs
其实来说都是比较高效的,因为没有那个项目动不动就 Deep Clone 上百万次,
大家喜欢用什么就用什么,
比如 做 api service 有用 json序列化,而且有用了 ignoreJson 之类的东西,这时候 Deep Clone 可能不好用 json序列化了,那我们可以选用上述的其他方式,简单方便
上述所有内容参阅: https://github.com/fs7744/DeepCloneExample
Deep Clone 常用方式总结的更多相关文章
- 深拷贝(deep clone)与浅拷贝(shallow clone)
深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...
- Windows校验文件哈希hash的两种常用方式
大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...
- 操作xml文档的常用方式
1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...
- iOS应用数据存储的常用方式
iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer: ...
- Postman几种常用方式
Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...
- JS类继承常用方式发展史
JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...
- 【转】shell:date 常用方式
在linux下获取时间字符串 命令 date # 以yyyymmdd格式输出23天之前现在这个时刻的时间 $ date +%Y%m%d –date=’23 days ago’ $ date -u Th ...
- JavaScript 中的对象深度复制(Object Deep Clone)
JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...
- Ruby中如何复制对象 (deep clone)(转载)
Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...
随机推荐
- Android控件(一)下拉刷新:SwipeRefreshLayout
须要注意的是SwipeRefreshLayout以下仅仅能够有一个直接子节点. 布局文件例如以下. <FrameLayout xmlns:android="http://schemas ...
- Swift String 一些常用方法
//字符串 //1 判断字符串是否为空 var test1Str="" var test1Str2:String = String(); println("test1St ...
- jQuery滑动选取数值范围插件
HTML 首先载入jQuery库文件以及jRange相关的css文件:jquery.range.css和插件:jquery.range.js <script src="jquery.j ...
- Net Configuration Assistant和Net Manager的区别
1.Net Configuration Assistant和Net Manager在oracle的配置工具中,Net Configuration Assistant(网络配置助手)和Net Manag ...
- 《JavaScript 闯关记》
为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚未掌握其精髓. 201 ...
- Unity3D Object.DontDestroyOnLoad 备忘
初学Untiy3D,记录备忘. public static void DontDestroyOnLoad(Object target); Makes the object target not be ...
- 详解JOIN
根据连接中使用的操作符不同,连接条件可分为:等连接,不等连接 连接本身分为: 内连接(INNER JOIN) (1)INNER JOIN 方式(INNER可以省略) 取两表的交集. (2)并表查询 ...
- 在ASP.NET MVC自定义错误页面
异常处理跳转页面 第一步,在项目的Web.config文件中找到节点<system.web> 在此节点下添加配置(Error为定义的控制器也可以多添加些error标签用于区分不同的错误) ...
- Java面试题整理(题目内容非原创)
面试题分类: 1.java 基础面试题 Java基础中对于io 中文件的读.写,util中的list map set这些要分清楚 还有线程.socket 都需要了解下 参考链接:http://blog ...
- 本地网址连不上远程mysql问题
问题:host 'XXX.XXX.XXX.XXX'is not allowed to connect to this MySQL server 解决办法: 进入远程mysql #mysql -u ro ...