Hay veces que es necesario mantener una copia de un objeto como "copia de seguridad".
Imaginemos que tenemos un objeto que contiene los datos de un empleado y un formulario en el que estamos modificando los datos de dicho empleado. Antes de dejar que el usuario modifique algún dato, guardamos una copia del estado actual del objeto empleado para poder restaurar sus valores en caso de que el usuario 'cancele' la operación.
Normalmente haríamos algo así:
savedEmployee = employee;
Si el usuario cancela la edición, simplemente restauramos el objeto empleado:
employee = savedEmployee;
Sin embargo, esto puede no funcionar como nos imaginamos. Si el objeto employee tiene una lista con sus contratos, y el usuario modifica esa lista, la lista de savedEmployee también se modificará.
Para evitar esto, podemos implementar en la clase Empleado el interfaz ICloneable que tiene un único método:
object Clone();
En este método copiaremos todos los valores del objeto en un nuevo objeto que es el que devolveremos. Si la clase Empleado tiene muchos campos, o aún peor contiene campos que son a su vez objetos de otras clases, copiarlos puede ser un proceso muy laborioso y propenso a introducir errores. En lugar de ello podemos usar una herramienta muy potente: la serialización/deserialización.
public object Clone()
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
object CloneObject = bf.Deserialize(ms);
ms.Close();
return CloneObject;
} Con esta implementación se hace una copia completa de todo el objeto y de todos sus objetos dependientes.
Hay que tener en cuenta que deberemos marcar la clase (y clases dependientes) con el atributo [Serializable()]
Si quisiéramos que alguno de los campos no se copiara, podemos evitarlo marcándolo con el atributo
[NonSerialized()].