Клонирование сериализуемых объектов в C#

Если класс сериализуем, то вы можете создать глубокий клон объекта из этого класса, сериализируя его и десериализируя его. В этом примере используется следующий код для определения общего метода расширения, который клонирует объекты из любого сериализуемого класса.

// Возвращает глубокий клон объекта типа T.
public static T DeepClone(this T obj)
{
    using (MemoryStream memory_stream = new MemoryStream())
    {
        // Сериализуем объект в поток памяти.
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(memory_stream, obj);

        // Перематываем поток и используем его для создания нового объекта.
        memory_stream.Position = 0;
        return (T)formatter.Deserialize(memory_stream);
    }
}

Код создает BinaryFormatter и использует его для сериализации объекта в поток памяти. Затем он использует форматтер для десериализации потока в новый объект.

Использование этого метода расширения прост. Следующий код показывает, как пример программы использует его для создания глубокого клонирования объекта с именем person1.

person3 = person1.DeepClone();

Чтобы это сработало, класс должен быть помечен как сериализуемый. Клон также включает только членов класса, которые могут быть сериализованы. Например, если некоторые свойства класса помечены атрибутом XmlIgnore, они не будут сериализованы или десериализованы, поэтому клон не получит значения исходного объекта для этих свойств.

В этом примере сериализуется объект Person. Следующий код показывает объявление класса Person.

[Serializable()]
class Person : ICloneable
{
    ...
}

Источник: http://csharphelper.com/blog/2016/09/clone-serializable-objects-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector