2010-01-28 20 views
8

Estoy usando una clase de instancia de una DLL de terceros, y necesito hacer una copia profunda en una instancia particular. La clase no está marcada como Serializable, y por lo tanto no puedo usar this suggested method using BinaryFormatter.Copia profunda de una instancia de clase .NET sin serialización

¿Cómo puedo obtener una copia profunda de este objeto sin utilizar la serialización?

+0

"Copiar" no necesariamente tiene sentido para todas las clases. –

+0

@Mehrdad Por favor, elabore, no sé a qué se refiere. –

+0

El ejemplo canónico es una clase Singleton. No debe (y no debería poder) copiarlo. –

Respuesta

5

He estado usando Copyable con gran éxito. Utiliza la reflexión debajo del capó. Es de código abierto. Asegúrese de leer Limitaciones y dificultades para ver si puede usarlo.

+0

Creo que esto funcionará para mí, ¡gracias! Entiendo las trampas, y afortunadamente con lo que estoy trabajando actualmente no tiene absolutamente ningún recurso no administrado. Gracias de nuevo, les dejaré saber cómo funciona. –

+0

(actualizó su respuesta para incluir el enlace SEO y confirmó que la biblioteca usa la reflexión) –

+0

Una advertencia no mencionada con * Copyable * es que las clases como esta no saben nada sobre las referencias externas en una estructura de datos. Supongamos, por ejemplo, que dentro de una clase hay una referencia a una matriz de un solo elemento de String, y supongamos que cada segundo alguna otra clase pone la hora actual en el primer (único) elemento de esa matriz. Un clon del objeto de la clase original contendría una cadena con la hora del día en que se copió el objeto, en lugar de una que cambia continuamente. – supercat

1

No puede (o quizás no debería ser lo que estoy buscando).

Si la clase no está diseñada para ser serializada, y no proporciona un medio para clonarla (es decir, en forma de un método de clonación o copia), entonces no puede hacer esto automáticamente. (Y además, si no se proporciona esta instalación, entonces probablemente no deba hacer esto, ya que la clase probablemente no esté diseñada con este tipo de uso en mente.)

Sin embargo, si realmente desea hacerlo y estás en un entorno de confianza total, luego, por supuesto, puedes hacer algunas cosas sucias usando FormatterServices.GetUninitializedObject y luego usar la reflexión para copiar los valores de campo de un objeto a otro. Pero esto es casi seguro que es una mala idea.

+2

Downvoter: ¿le importa proporcionar una razón? –

+0

No he votado negativamente, pero creo que deberías ver la respuesta de Kenny. – Amy

1

Una sugerencia es utilizar la serialización de Json (que utiliza la reflexión, y no se basa en el atributo [Serializable]) para serializar y deserializar en una copia. Por ejemplo, utilizando la biblioteca Json.Net:

var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
    JsonConvert.SerializeObject(sourceSnapshotObject)); 
Cuestiones relacionadas