我们有一个应用程序,可以对数据对象进行比较,以确定对象的一个版本是否与另一个版本不同。我们的应用程序还对这些对象进行了一些广泛的缓存,并且在进行这些比较时我们遇到了一些性能问题。
这是工作流程:
- 数据项 1 是内存中的当前项。该项目最初是从缓存中检索并深度克隆的(所有子对象,例如字典等)。然后编辑数据项 1,并修改其属性。
- 然后,我们将该对象与存储在缓存中的原始版本进行比较。由于数据项 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);
}
}
我们最初使用以下内容进行克隆:
public object Clone()
{
return this.MemberwiseClone();
}
这性能更高,但因为它进行了浅克隆,所以作为该对象属性的所有复杂对象(例如字典等)都没有被克隆。该对象仍将包含与缓存中的对象相同的引用,因此在比较时属性将相同。
那么,是否有人有一种有效的方法来对 C# 对象进行深度克隆,从而涵盖克隆整个对象图?
如果不在所有需要克隆的数据对象上显式实现 ICloneable,您将无法获得比通用二进制序列化更好的结果。另一种可能的途径是反思,但如果您正在寻找性能,您也不会对此感到满意。
如果对象不同,我会考虑使用 ICloneable 进行深度复制和/或 IComparable 进行比较……如果性能对您来说是一个大问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)