Clonación profunda de objetos en Unity

Por el momento hay que apañarse con una versión de Mono equivalente a .NET 3.5 al programar para Unity y ello conlleva bastantes limitaciones con respecto a versiones más modernas, siendo una muy importante la relacionada con la clonación de objetos. Lo primero que hay que tener en cuenta es que existen dos tipos de clonación, la profunda y la superficial, Deep y MemberwiseClone respectivamente.

La profunda devuelve una copia exacta y completa del objeto referencia, mientras que la superficial, citando la documentación oficial de Microsoft: «The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. If a field is a value type, a bit-by-bit copy of the field is performed. If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.«. Las colecciones e instancias/objetos que formen parte de las clases a clonar no se clonaran, sino que solo se pasará la referencia de la instancia actual.

Decidí probar todas las posibilidades que pudiese encontrar para intentar llevar a cabo la clonación profunda en Unity y el resumen es el siguiente, que anticipo no es muy positivo.

GeorgeClooney

Se basa en métodos de extensión y para que funcionen hay que añadir/importar muchas cosas…lo cual no me hace nada de gracia. Y las clases a clonar requieren explícitamente del constructor por defecto y no sirve con ponerlo en la clase padre de la clase especializada o hija a clonar.

FastDeepCloner

Requiere C# 4.1 y aunque Unity incorpora de forma experimental la opción de trabajar con C# 6, siempre será bajo tu entera responsabilidad.

DeepCloner

Requiere la libreria .NETStandard 1.3 y desde Unity comentan que darán soporte a la 2 y únicamente cuando esté completada.

NClone

Al intentar hacerla funciona salta un error «Cyclic reference found during replication».

Nuclex FastCloner

Requiere System.Collections.Concurrent y .NET 3.5 no tiene, adiós Tree. Los dos métodos que si compilan al ejecutarse hacen que se cierre Unity, adiós Reflexión y Serialización.

CloneBejave

Requiere System.Threading.Tasks y en .NET 3.5 no está presente.

CloneExtensions

Requiere contar con versiones superiores a .NET 4.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *