高性能克隆

Ian*_*Ian 8 c# il clone

我正在以一种方式深入克隆对象图.我将有多个线程非常快速地克隆图形,以便它们可以在某些状态下播放并丢弃结果,如果它们不感兴趣,则返回到原始状态再次尝试.

我目前正在通过二进制序列化使用深度克隆,尽管它有效但速度并不快.我见过像protobuf这样的其他库,但我的对象图中的类可以在外部程序集中定义,继承自主程序集中的类,并且如果可能的话,不希望在那些使用程序集中添加任何复杂性.

我遇到的一个有趣的事情是使用自动生成的IL进行克隆.它似乎还没有完成,我已发布,看看作者是否已经做了更多,但我猜不是.有没有其他人通过IL开发或看到更全功能的深度克隆方式?或者另一种快速的方法?

Ada*_*rth 3

除了序列化之外,我只考虑三种选择:

  • 坚持序列化,但要定制它。如果您想以声明方式对内容进行分类,并且很可能会获得性能提升,这可能会很有用。
  • 基于反射的对象行走,与 IL 发射器(例如Fasterflect)结合使用。
  • 代码生成或通过字面上相互分配属性来编写您自己的克隆(我们有一些旧代码,它们使用我们所谓的复制构造函数,获取其自身的实例并手动复制属性/字段)。

我们有一些控制二进制序列化的代码实例,以便我们可以序列化内部 GUID 表(我们有很多重复的 GUID,并通过 .NET Remoting 序列化非常大的列表)。它对我们来说效果很好,我们不需要第三方序列化框架,但是,它是带有一点代码生成的手工制作的东西。

CSLA.NET框架具有一个名为 的类UndoableBase,它使用反射来序列化Hashtable属性/字段值。用于允许回滚内存中的对象。这可能适合您的“返回原始状态再试一次”这句话。

就我个人而言,我会进一步研究基于反射的(最好使用发出的 IL 以获得更好的性能)解决方案,这样您就可以利用类/成员属性来控制克隆过程。如果性能为王,这可能不会减少它。