Markörgränssnitt och djupa kopior - 1

"Hej, Amigo!"

"Hej, Bilaabo!"

"Idag ska jag berätta om markörgränssnitt ."

"Markörgränssnitt är gränssnitt utan metoder. När en klass implementerar ett sådant gränssnitt säger vi att det är märkt av det."

"Exempel på dessa gränssnitt inkluderar: Klonbar, Serialiserbar, Remote ."

"Det serialiserbara gränssnittet används för att markera klasser som stöder serialisering, vilket indikerar att instanser av dessa klasser automatiskt kan serialiseras och deserialiseras."

" Remote -gränssnittet används för att identifiera objekt som stöder fjärrexekvering, dvs metoder som kan anropas från en annan virtuell Java-maskin och/eller en annan dator."

"Det klonbara gränssnittet används för att markera klasser som stöder kloning."

"Åh, om kloning eller kopiering."

"Det finns två typer av kopiering: ytlig och djup."

" Grund kopiering är att skapa en kopia av ett objekt, utan att göra dubbletter av något av objekten det refererar till."

" Djupkopiering innebär duplicering av ett objekt, inklusive objekt som det refererar till, och de objekt som dessa objekt refererar till, etc."

"Det finns ett riktigt bra sätt att på ett tillförlitligt sätt skapa en djup klon."

"Denna metod fungerar även om utvecklare har glömt att markera en klass som kloningsbar. "Det enda kravet är att objekten måste vara serialiserbara."

"Så här gör du:"

1) Skapa en buffert (byte-array) i minnet.

2) Serialisera objektet och subobjekten i bufferten.

3) Avserialisera objekthierarkin som sparats i bufferten.

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

"På den första raden skapar vi objectOriginal , som vi kommer att klona. Objektet och alla dess underobjekt måste stödja serialisering."

"På den tredje raden skapar vi en ByteArrayOutputStream , som kommer att expandera dynamiskt när ny data läggs till (som en ArrayList)."

"I rad 4 skapar vi en ObjectOutputStream , som används för serialisering."

"På rad 5 serialiserar vi objectOriginal till en byte-array med outputStream och sparar den i writeBuffer ."

"På rad 8 konverterar vi writeBuffer till en vanlig byte array. Senare kommer vi att 'läsa' vårt nya objekt från denna array."

"I rad 9 omvandlar vi buffert till en ByteArrayInputStream för att kunna läsa från den som en InputStream."

"På rad 10 skickar vi readBuffer till ObjectInputStream -konstruktorn för att läsa (deserialisera) objektet."

"På rad 11 läser vi vårt objekt och konverterar det till ett BigObject ."

"Vad tror du?"

"Det är vackert."

"Och förresten, när koden är markerad i olika färger är det mycket lättare att förstå."