2017-02-03 49 views
0

我需要多次克隆相当大的对象,并且我正在寻找更快的方法来完成它。几次克隆对象的最快方法是什么

现在我使用BinaryForamterMemoryStream的序列化。因此,这里是我想用的功能,我只是讲(DeserializeToList的方法,我在寻找):

var originalObject = new MyClass(); 
var objectClones = new List<MyClass>(); 
var cloneCount = 10; 

var formatter = new BinaryFormatter(); 
using (var stream = new MemoryStream()) 
{ 
    formatter.Serialize(stream, originalObject); 
    stream.Seek(0, SeekOrigin.Begin); 
    objectClones = (MyClass)formatter.DeserializeToList(formatter, cloneCount); 
} 

没有任何人有什么想法?

更新:
我不想改变MyClass。这就是我使用二进制序列化的原因。所以MyClass.Clone现在不是解决方案。

更新2:
我不想连碰MyClass或它们的属性。所以手动属性复制不是我期待的方式。

+3

如果你的对象是你的建议一样大,记住,这个解决方案将需要大约3倍的内存来执行克隆操作。 OriginalObject + MemoryStream + CloneObject。通过手动克隆所需的字段,您可能会获得更快的性能和更好的内存利用率。 –

+0

@BradleyUffner是的,没错。但是现在我不想改变'MyClass' – Alexander

+0

然后检查序列化代理。它允许您在不修改原始类的情况下执行手动二进制序列化。它可以是一个复杂的想法 –

回答

0

我没有测试基准测试的性能,但为什么不实施克隆接口?

public interface ICloneable<T> 
{ 
    T Clone(); 
} 

public class ComplessObj : ICloneable<Book> 
{ 
    public string f1; 
    public int f2; 
    .. and so on 

    public ComplessObj Clone() 
    { 
     return new ComplessObj { /* set properties f1,f2 ..*/ }; 
    } 
} 

,每次你想你的复杂对象的深克隆列表

您可以使用LINQ

List<ComplessObj> ComplessObj_2 = ComplessObj.Select(co => co.Clone()).ToList(); 

List<ComplessObj> ComplessObj_2 = ComplessObj.ConvertAll(co => co.Clone()); 
+0

谢谢你的评论,但我不想改变'MyClass' – Alexander

1

可以用于此用途的扩展方法如果你不想碰原来的课程。

public class MyClass 
{ 
    public string Name { get; set; } 
} 

public static class MyClassExtensions 
{ 
    public static MyClass Clone(this MyClass obj) 
    { 
     return new MyClass() 
     { 
      Name = obj.Name 
     }; 
    } 
} 

,然后用它喜欢:

var originalObj = new MyClass() { Name = "Original" }; 
var clonedObj = originalObj.Clone(); 
Console.WriteLine(clonedObj.Name); // Name = "Original" 
+0

我可以改变'MyClass',但我没有想要做到这一点。所以像扩展方法这样的解决方法并不比普通的“克隆”方法更好。 – Alexander

相关问题