Markerschnittstellen und tiefe Kopien – 1

„Hallo, Amigo!“

„Hallo, Bilaabo!“

„Heute erzähle ich Ihnen etwas über Marker-Schnittstellen .“

„Markerschnittstellen sind Schnittstellen ohne Methoden. Wenn eine Klasse eine solche Schnittstelle implementiert, sagen wir, dass sie dadurch markiert wird.“

„Beispiele für diese Schnittstellen sind: Klonbar, Serialisierbar, Remote .“

„Die Serializable- Schnittstelle wird verwendet, um Klassen zu markieren, die Serialisierung unterstützen, was darauf hinweist, dass Instanzen dieser Klassen automatisch serialisiert und deserialisiert werden können.“

„Die Remote- Schnittstelle wird verwendet, um Objekte zu identifizieren, die die Remote-Ausführung unterstützen, also Methoden, die von einer anderen Java Virtual Machine und/oder einem anderen Computer aufgerufen werden können.“

„Die Cloneable- Schnittstelle wird verwendet, um Klassen zu markieren, die das Klonen unterstützen.“

„Oh, über das Klonen oder Kopieren.“

„Es gibt zwei Arten des Kopierens: flaches und tiefes.“

Beim flachen Kopieren wird eine Kopie eines Objekts erstellt, ohne Duplikate der Objekte zu erstellen, auf die es verweist.“

Deep Copy beinhaltet das Duplizieren eines Objekts, einschließlich der Objekte, auf die es verweist, und der Objekte, auf die diese Objekte verweisen usw.“

„Es gibt eine wirklich gute Möglichkeit, zuverlässig einen Deep Clone zu erstellen.“

„Diese Methode funktioniert auch dann, wenn Entwickler vergessen haben, eine Klasse als klonbar zu markieren. „Die einzige Voraussetzung ist, dass die Objekte serialisierbar sein müssen.“

„So machen Sie es:“

1) Erstellen Sie einen Puffer (Byte-Array) im Speicher.

2) Serialisieren Sie das Objekt und die Unterobjekte im Puffer.

3) Deserialisieren Sie die im Puffer gespeicherte Objekthierarchie.

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 der ersten Zeile erstellen wir objectOriginal , das wir klonen werden. Das Objekt und alle seine Unterobjekte müssen Serialisierung unterstützen.“

„In der dritten Zeile erstellen wir einen ByteArrayOutputStream , der sich dynamisch erweitert, wenn neue Daten hinzugefügt werden (wie eine ArrayList).“

„In Zeile 4 erstellen wir einen ObjectOutputStream , der zur Serialisierung verwendet wird.“

„In Zeile 5 serialisieren wir objectOriginal mithilfe von OutputStream in ein Byte-Array und speichern es in writeBuffer .“

„In Zeile 8 konvertieren wir writeBuffer in ein gewöhnliches Byte-Array. Später werden wir unser neues Objekt aus diesem Array ‚lesen‘.“

„In Zeile 9 transformieren wir buffer in einen ByteArrayInputStream , um daraus wie einen InputStream zu lesen.“

„In Zeile 10 übergeben wir readBuffer an den ObjectInputStream- Konstruktor, um das Objekt zu lesen (deserialisieren).“

„In Zeile 11 lesen wir unser Objekt und konvertieren es in ein BigObject .“

"Was denken Sie?"

"Es ist wunderschön."

„Und wenn der Code übrigens in verschiedenen Farben hervorgehoben wird, ist er viel einfacher zu verstehen.“