高效克隆缓存的对象

ste*_*e_c 3 c# performance clone deep-copy

我们有一个应用程序,它对数据对象进行比较,以确定对象的一个​​版本是否与另一个版本不同.我们的应用程序还对这些对象进行了一些广泛的缓存,在进行这些比较时,我们遇到了一些性能问题.

这是工作流程:

  1. 数据项1是内存中的当前项.此项最初是从缓存中检索并进行深度克隆(所有子对象,如字典等).然后编辑数据项1,并修改其属性.
  2. 然后,我们将此对象与存储在缓存中的原始版本进行比较.由于数据项1已克隆且其属性已更改,因此这些对象应该不同.

这里有几个问题.

主要问题是我们的深度克隆方法非常昂贵.我们对浅色克隆进行了分析,速度慢了10倍.那是废话.这是我们深度克隆的方法:

    public object Clone()    
    {
        using (var memStream = new MemoryStream())
        {
            var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
            binaryFormatter.Serialize(memStream, this); 
            memStream.Seek(0, SeekOrigin.Begin);
            return binaryFormatter.Deserialize(memStream);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我们最初使用以下内容进行克隆:

public object Clone()
{
    return this.MemberwiseClone();
}
Run Code Online (Sandbox Code Playgroud)

这样做效率更高,但是因为它做了浅层克隆,所有复制对象(这些对象的属性,如字典等)都没有被克隆.该对象仍将包含与缓存中的对象相同的引用,因此在比较时属性将相同.

那么,有没有人有一种有效的方法在C#对象上进行深度克隆,这将克隆整个对象图?

Cha*_*ant 6

如果没有在需要克隆的所有数据对象上明确地实现ICloneable,那么您将无法比通用二进制序列化更好.另一种可能的路线是反射,但如果您正在寻找性能,您将不会满意.

我会考虑与ICloneable命中深拷贝和/或IComparable的比较,如果对象是不同的...如果性能是大到你一个问题.