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

Если ваши объекты как большой, как вы предлагаете, имейте в виду, что это решение будет нужно примерно 3x больше памяти для выполнения операции клонирования. OriginalObject + MemoryStream + CloneObject. Вероятно, вы можете быстрее повысить производительность и улучшить использование памяти, вручную клонируя нужные вам поля. –

+0

@BradleyUffner Да, это так. Но я бы не хотел менять MyClass' на данный момент – Alexander

+0

Затем проверьте суррогаты сериализации. Он позволяет выполнять ручную двоичную сериализацию без изменения исходного класса. Это может быть немного сложной мыслью –

ответ

0

Я не тестировал производительность теста, но почему бы не реализовать интерфейс Clone?

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

Смежные вопросы