Implementing Deep Cloning via Serializing objects使用Serializable来实现深拷贝

Using the Code

This is a helper class that can be used to perform a deep copy of an object:

 Collapse
using System;

using System.IO;

using System.Runtime.Serialization;

using System.Runtime.Serialization.Formatters.Binary;     

      

/// <summary>

/// 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>(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);

  }

 }

}

Usage of this class becomes ObjectCopier.Clone(objectBeingCloned);.

Points of Interest

In case you prefer to use the new Extension methods of C# 3.0, change the method to have the following signature:

   public static T Clone<T>(this T source)

   {

      ...

   }

Now the method call simply becomes objectBeingCloned.Clone();.

你可能感兴趣的:(Serializable)