2017-02-03 19 views
0

かなり大きなオブジェクトを何度も複製する必要があり、私はそれを行うより速い方法を見つけています。オブジェクトを複数回クローンする最も速い方法は何ですか

今私は、BinaryForamterによってMemoryStreamにシリアル化を使用しています。だからここ(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); 
} 

誰もが任意のアイデアを持っていますか?

UPDATE:
私はMyClassを変更する必要はありません。だから私はバイナリのシリアル化を使用しています。だからMyClass.Cloneは現在解決策ではありません。

UPDATE 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」を変更できますが、それをやりたいしたがって、拡張メソッドのような回避策は、通常の 'Clone'メソッドよりも良くありません。 – Alexander

関連する問題