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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。