ObjectCopier

From Unify Community Wiki
Jump to: navigation, search

Author: Berenger

Description

Instead of implementing the IClonable interface, that script allow you to clone an object with serialization and deserialization. Thus, the object must be serializable.

Source : http://stackoverflow.com/questions/78536/cloning-objects-in-c-sharp.

Usage

This script uses .Net Extension, so you can use it like that (MyClass and all it's components must be serializable) :

MyClass obj1 = new MyClass();
MyClass obj2 = obj1.Clone();


CSharp - ObjectCopier.cs

using System;
using System.Collections;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
 
/// <summary>
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// 
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// </summary>
public static class ObjectCopier
{
    /// <summary>
    /// Perform a deep Copy of the object.
    /// </summary>
    /// <typeparam name="T">The type of object being copied.</typeparam>
    /// <param name="source">The object instance to copy.</param>
    /// <returns>The copied object.</returns>
    public static T Clone<T>(this T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }
 
        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }
 
        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
     }
}
Personal tools
Namespaces

Variants
Actions
Navigation
Extras
Toolbox