Deep Clone Example

总结 Deep Clone 一般有如下几种实现方式:

  1. 纯手工每个类实现赋值 (ps: 不做介绍,一般都不想这么玩)
  2. 序列化和反序列化
  3. 纯反射
  4. 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 常用方式总结的更多相关文章

  1. 深拷贝(deep clone)与浅拷贝(shallow clone)

    深拷贝(deep clone)与浅拷贝(shallow clone) 浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复 ...

  2. Windows校验文件哈希hash的两种常用方式

    大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像 ...

  3. 操作xml文档的常用方式

    1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...

  4. iOS应用数据存储的常用方式

    iOS应用 数据存储的常用方式 XML属性列表 plist Preference 偏好设置 NSKeyedArchiver 归档 Core Data SQLite3 应用沙盒: Layer:     ...

  5. Postman几种常用方式

    Postman几种常用方式 1.get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到U ...

  6. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  7. 【转】shell:date 常用方式

    在linux下获取时间字符串 命令 date # 以yyyymmdd格式输出23天之前现在这个时刻的时间 $ date +%Y%m%d –date=’23 days ago’ $ date -u Th ...

  8. JavaScript 中的对象深度复制(Object Deep Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法. JavaScript中的赋值,其实并不是复制对象,而是类似`c/c++`中的引用(或指针),因此下面的代码中改变对象b ...

  9. Ruby中如何复制对象 (deep clone)(转载)

    Ruby中如何复制对象 (deep clone) 用Ruby复制一个对象(object)也许没有你想像的那么容易. 今天我google了半天, 做个总结吧. 先从最简单的开始, b = a 是复制吗? ...

随机推荐

  1. asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。

    最近开发一个项目,里面用到了非.net开发的一个dll文件接口,发现发布到window2003服务器上后,运行网站总是提示 "无法加载 DLL"D:\11\1.dll": ...

  2. 使用Oracle安装账户登录数据库

    如果Linux或Unix平台,安装了Oracle,而且有root账号,则使用“su Oracle安装账户”的方式,sqlplus登录到数据库,这种方式是最可靠的.正如@dbsnake所说,”主要是Or ...

  3. H面试程序(11): 判断字符串是否包含子串问题

    题目描述:                        如字符串str1为''abcdef'''                       字符串str2为'' bc''; 则字符串str1中含有 ...

  4. vs2010安装svn插件

    vs2010安装svn插件及简单使用 1.下载安装程序,安装 2.配置vs2010 3.check out工程 1.下载安装程序,安装 2.配置vs2010 3.check out工程 Open th ...

  5. 初识动画animation

    工作半年了,基本没怎么用到动画,现在对已学到的动画做一个总结(真的非常非常基础啊啊啊),准备之后再慢慢研究一下动画(有好的教程可以推荐给我咩~~). animation animation:mymov ...

  6. 《think in python》学习-8

    字符串 字符串是一个序列,可以用方括号操作符来访问字符串中的单独字符 fruit = 'banana' letter = fruit[1] 方括号中的表达式称为下标 下标从0 开始 任何表达式,包括变 ...

  7. iOS设计模式解析(六)代理模式

    代理模式:为其他对象创建一个代理以控制对这个对象的访问 UML解释:客户端向Proxy发起一个Request()请求,Proxy对象会把这个Request转发给Proxy对象的RealSubject. ...

  8. iOS设计模式解析(三)适配器模式

    适配器模式:将一个类的借口转换成客户端希望的另一个接口 有一个很直观的图: 例如      :电源适配器(将110V电压转换成220V电压,其中Traget是220V电压,adaptee就是110V电 ...

  9. WindowsForm 计算器

             计算器  可以分一下类 数字键 + - * / % =和撤销 归零C最简单 下面看一下计算器具体的代码 using System; using System.Collections. ...

  10. ubuntu 开启 rewrite 模块

    1.sudo a2enmod rewrite 开启Rewrite模块 (停用模块,使用 a2dismod) 2. 在/etc/apache2/ 修改apache2.conf 文件中把AllowOver ...