Marker interfészek és mély másolatok - 1

– Szia Amigo!

– Szia, Bilaabo!

"Ma a jelölőfelületekről fogok beszélni ."

"A marker interfészek metódus nélküli interfészek. Amikor egy osztály implementál egy ilyen interfészt, azt mondjuk, hogy az meg van jelölve."

"Példák ezekre az interfészekre: Klónozható, Sorosozható, Távoli ."

"A Serializable interfész a szerializálást támogató osztályok megjelölésére szolgál, jelezve, hogy ezen osztályok példányai automatikusan szerializálhatók és deszerializálhatók."

"A Remote interfész a távoli végrehajtást támogató objektumok azonosítására szolgál, azaz olyan metódusok, amelyek egy másik Java virtuális gépről és/vagy másik számítógépről hívhatók meg."

"A klónozható felület a klónozást támogató osztályok megjelölésére szolgál."

– Ó, a klónozásról vagy a másolásról.

"Kétféle másolás létezik: sekély és mély."

" A sekély másolás egy objektum másolatának létrehozása anélkül, hogy a hivatkozott objektumokról másolatokat készítene."

" A mélymásolás magában foglalja egy objektum megkettőzését, beleértve az objektumokat, amelyekre hivatkozik, és az objektumokat, amelyekre ezek az objektumok hivatkoznak, stb."

"Van egy nagyon jó módszer a mély klónok megbízható létrehozására."

"Ez a módszer akkor is működik, ha a fejlesztők elfelejtettek egy osztályt klónozhatóként megjelölni. "Az egyetlen követelmény az, hogy az objektumoknak szerializálhatónak kell lenniük."

"Íme, hogyan kell csinálni:"

1) Hozzon létre egy puffert (byte tömb) a memóriában.

2) Sorosítsa az objektumot és az alobjektumokat a pufferbe.

3) Deszerializálja a pufferben elmentett objektumhierarchiát.

Kód
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();

"Az első sorban létrehozzuk az objectOriginal -t , amelyet klónozni fogunk. Az objektumnak és minden alobjektumának támogatnia kell a szerializálást."

"A harmadik sorban létrehozunk egy ByteArrayOutputStream-et , amely dinamikusan bővül új adatok hozzáadásával (például egy ArrayList)."

"A 4. sorban létrehozunk egy ObjectOutputStream- et , amelyet a szerializáláshoz használunk."

"Az 5. sorban sorba rendezzük az objectOriginal fájlt egy bájttömbbe az outputStream segítségével , és elmentjük a writeBufferbe ."

"A 8. sorban a writeBuffert egy közönséges bájttömbbé alakítjuk át. Később ebből a tömbből fogjuk "beolvasni" az új objektumunkat."

"A 9. sorban a puffert ByteArrayInputStreammé alakítjuk át, hogy úgy olvassunk belőle, mint egy InputStreamből. "

"A 10. sorban a readBuffert átadjuk az ObjectInputStream konstruktornak, hogy beolvassa (deserializálja) az objektumot."

"A 11. sorban beolvassuk az objektumunkat, és BigObjectmé alakítjuk . "

"Mit gondolsz?"

"Ez gyönyörű."

– És mellesleg, ha a kód különböző színekkel van kiemelve, sokkal könnyebben érthető.