Tag: deep copy

高效克隆缓存的对象

我们有一个应用程序,它对数据对象进行比较,以确定对象的一个​​版本是否与另一个版本不同。 我们的应用程序也对这些对象进行了一些广泛的缓存,在进行这些比较时我们遇到了一些性能问题。 这是工作流程: 数据项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#对象上进行深度克隆,这将克隆整个对象图?

检测不可变量的高效方法?

我有一个实用程序,旨在传递我们系统周围的对象。 由于它是一个multithreading环境,因此该实用程序会对其传递的每个对象进行深层复制,以防止出现任何线程安全问题。 我正在努力转换我们的系统以使用不可变对象来消除对此副本的需要。 我想知道检测对象是不可变的最好(最快)方法是什么? 我的第一个想法就是了解我们放在所有不可变对象(MessageAttribute)上的属性。 正如您从下面的性能配置文件中看到的那样,它会受到很大影响(大约是所有其他检查执行时间的10倍)。 我怎么能检测到我的不可变通过? 我可以做一个typeof()比较,看起来效果更好,但这看起来相当笨拙,而且随着我们一直添加更多不可变的东西,它将是难以维护的。 编辑:我忘了提到布尔值被重构为变量以用于分析,实际上,结果存储在isDefined的表达式实际上是在else if语句中,因此将被击中大约10倍。这个配置文件(我更关心平均执行时间而不是绝对执行时间)。

如何执行未标记为可序列化的对象的深层副本(在C#中)?

我试图在C#中创建一个剪贴板堆栈。 剪贴板数据存储在System.Windows.Forms.DataObject对象中。 我想将每个剪贴板条目( IDataObject )直接存储在Generic列表中。 由于Bitmaps(似乎是)存储的方式我认为我需要先将深拷贝执行才能将其添加到列表中。 我尝试使用二进制序列化(见下文)来创建深层副本,但由于System.Windows.Forms.DataObject未标记为可序列化,因此序列化步骤失败。 有任何想法吗? public IDataObject GetClipboardData() { MemoryStream memoryStream = new MemoryStream(); BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(memoryStream, Clipboard.GetDataObject()); memoryStream.Position = 0; return (IDataObject) binaryFormatter.Deserialize(memoryStream); }

C#自动深度复制struct

我有一个结构, MyStruct ,有私人成员private bool[] boolArray; 和方法ChangeBoolValue(int index, bool Value) 。 我有一个类, MyClass ,有一个字段public MyStruct bools { get; private set; } public MyStruct bools { get; private set; } 当我从现有的MyStruct对象创建一个新的MyStruct对象,然后应用方法ChangeBoolValue()时,两个对象中的bool数组都会更改,因为引用而不是引用的引用被复制到新对象。 例如: MyStruct A = new MyStruct(); MyStruct B = A; //Copy of A made B.ChangeBoolValue(0,true); //Now A.BoolArr[0] == B.BoolArr[0] == true 有没有办法强制副本实现更深层次的副本,或者有没有办法实现这个不会有同样的问题? 我特意将MyStruct设为结构,因为它是值类型,我不希望引用传播。

复制对象属性:reflection或序列化 – 哪个更快?

我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象。 有两种选择: 使用reflection,浏览第一个对象的属性并复制值。 序列化第一个对象并反序列化副本。 两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些? 例 class Person { public int ID { get; set; } public string Firsthand { get; set; } public string LastName { get; set; } public int Age { get; set; } public decimal Weight { get; set; } } 需要将属性值从Person p1复制到Person p2 。 对于这个简单的样本 – 哪种方法更快? 更新 对于序列化,我使用此处建议的ObjectCopier: 深度克隆对象 […]