Interfaces de marcadores y copias profundas - 1

"¡Hola, amigo!"

"¡Hola, Bilaabo!"

"Hoy les hablaré sobre las interfaces de marcadores ".

"Las interfaces de marcador son interfaces sin métodos. Cuando una clase implementa una interfaz de este tipo, decimos que está marcada por ella".

"Ejemplos de estas interfaces incluyen: clonable, serializable, remota ".

"La interfaz Serializable se usa para marcar las clases que admiten la serialización, lo que indica que las instancias de estas clases se pueden serializar y deserializar automáticamente".

"La interfaz remota se usa para identificar objetos que admiten la ejecución remota, es decir, métodos que se pueden invocar desde otra máquina virtual Java y/o una computadora diferente".

"La interfaz Cloneable se usa para marcar clases que admiten la clonación".

"Oh, sobre la clonación o la copia".

"Hay dos tipos de copia: superficial y profunda".

" La copia superficial es crear una copia de un objeto, sin hacer duplicados de ninguno de los objetos a los que hace referencia".

" La copia profunda implica duplicar un objeto, incluidos los objetos a los que hace referencia y los objetos a los que hacen referencia esos objetos, etc."

"Hay una forma realmente buena de crear un clon profundo de forma fiable".

"Este método funciona incluso si los desarrolladores han olvidado marcar una clase como Clonable. El único requisito es que los objetos deben ser serializables".

"Así es como lo haces:"

1) Cree un búfer (matriz de bytes) en la memoria.

2) Serialice el objeto y los subobjetos en el búfer.

3) Deserializar la jerarquía de objetos guardada en el búfer.

Código
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

"En la primera línea, creamos objectOriginal , que clonaremos. El objeto y todos sus subobjetos deben admitir la serialización".

"En la tercera línea, creamos un ByteArrayOutputStream , que se expandirá dinámicamente a medida que se agreguen nuevos datos (como un ArrayList)".

"En la línea 4, creamos un ObjectOutputStream , que se usa para la serialización".

"En la línea 5, serializamos objectOriginal en una matriz de bytes usando outputStream y lo guardamos en writeBuffer ".

"En la línea 8, convertimos writeBuffer en una matriz de bytes ordinaria. Más tarde, 'leeremos' nuestro nuevo objeto de esta matriz".

"En la línea 9, transformamos el búfer en un ByteArrayInputStream para poder leerlo como un InputStream".

"En la línea 10, pasamos readBuffer al constructor ObjectInputStream para leer (deserializar) el objeto".

"En la línea 11, leemos nuestro objeto y lo convertimos en un BigObject ".

"¿Qué opinas?"

"Es hermoso."

"Y, por cierto, cuando el código está resaltado en diferentes colores, es mucho más fácil de entender".