Marker-interfaces en diepe kopieën - 1

"Hallo Amigo!"

"Hallo Bilaabo!"

"Vandaag zal ik je vertellen over marker-interfaces ."

"Marker-interfaces zijn interfaces zonder methoden. Wanneer een klasse zo'n interface implementeert, zeggen we dat deze erdoor wordt gemarkeerd."

"Voorbeelden van deze interfaces zijn: Cloneable, Serializable, Remote ."

"De Serializable -interface wordt gebruikt om klassen te markeren die serialisatie ondersteunen, wat aangeeft dat instanties van deze klassen automatisch kunnen worden geserialiseerd en gedeserialiseerd."

"De externe interface wordt gebruikt om objecten te identificeren die uitvoering op afstand ondersteunen, dwz methoden die kunnen worden aangeroepen vanaf een andere virtuele Java-machine en/of een andere computer."

"De Cloneable- interface wordt gebruikt om klassen te markeren die klonen ondersteunen."

"Oh, over klonen of kopiëren."

"Er zijn twee soorten kopiëren: ondiep en diep."

" Oppervlakkig kopiëren is het maken van een kopie van een object, zonder duplicaten te maken van de objecten waarnaar het verwijst."

" Diep kopiëren omvat het dupliceren van een object, inclusief objecten waarnaar het verwijst, en de objecten waarnaar die objecten verwijzen, enz."

"Er is een heel goede manier om betrouwbaar een diepe kloon te maken."

"Deze methode werkt zelfs als ontwikkelaars zijn vergeten een klasse als Cloneable te markeren. "De enige vereiste is dat de objecten serialiseerbaar moeten zijn."

"Hier is hoe je het doet:"

1) Creëer een buffer (bytearray) in het geheugen.

2) Serialiseer het object en de subobjecten in de buffer.

3) Deserialiseer de objecthiërarchie die in de buffer is opgeslagen.

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

"In de eerste regel maken we objectOriginal , dat we zullen klonen. Het object en al zijn subobjecten moeten serialisatie ondersteunen."

"In de derde regel maken we een ByteArrayOutputStream , die dynamisch zal uitbreiden wanneer nieuwe gegevens worden toegevoegd (zoals een ArrayList)."

"In regel 4 maken we een ObjectOutputStream , die wordt gebruikt voor serialisatie."

"In regel 5 serialiseren we objectOriginal in een byte-array met behulp van outputStream en slaan we het op in writeBuffer ."

"In regel 8 zetten we writeBuffer om in een gewone byte-array. Later zullen we ons nieuwe object uit deze array 'lezen'."

"In regel 9 transformeren we buffer in een ByteArrayInputStream om eruit te lezen als een InputStream."

"In regel 10 geven we readBuffer door aan de ObjectInputStream- constructor om het object te lezen (deserialiseren)."

"In regel 11 lezen we ons object en converteren het naar een BigObject ."

"Wat denk je?"

"Het is mooi."

"En trouwens, als de code in verschillende kleuren is gemarkeerd, is het veel gemakkelijker te begrijpen."