2017-02-03 6 views
0

나는 꽤 큰 개체를 여러 번 복제해야하며이를 수행하는 더 빠른 방법을 찾고 있습니다.개체를 여러 번 복제하는 가장 빠른 방법은 무엇입니까

이제는 BinaryForamter을 사용하여 MemoryStream에 직렬화를 사용합니다.

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); 
} 

는 사람이 어떤 생각을 가지고 있습니까 : 그래서 여기에 내가 (DeserializeToList 내가위한 방법을 찾고있다)에 대해 말하고 기능을 사용하고 싶습니다 어떻게?

업데이트 : MyClass을 변경하지 않으
. 그래서 바이너리 직렬화를 사용합니다. 따라서 MyClass.Clone은 현재 해결책이 아닙니다.

UPDATE 2 :
MyClass하거나 속성을 터치하지 않습니다. 그래서 수동으로 복사하는 것은 내가 찾는 방법이 아닙니다.

+3

당신의 목적은 당신이 제안처럼 큰 경우,이 솔루션은 복제 작업을 수행하는 데 약 3 배 많은 메모리를 필요가 있다는 점에 유의하십시오. OriginalObject + MemoryStream + CloneObject입니다. 필요한 필드를 수동으로 복제하면 성능이 향상되고 메모리 사용률이 향상 될 수 있습니다. –

+0

@BradleyUffner 네, 그렇습니다. 하지만 다음 지금 – Alexander

+0

체크 아웃 직렬화 대리를위한 변화 'MyClass'을 좋아하지 않을 것이다. 원래 클래스를 수정하지 않고 수동으로 이진 직렬화를 수행 할 수 있습니다. 당신이 –

답변

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

코멘트 주셔서 감사 직렬화 서로 게이트를 사용하는 것이 좋습니다 얼마나 더 설명해주십시오 수있는 약간 복잡한 생각 – 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