2017-02-03 68 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

相關問題