マーカーインターフェイスとディープコピー - 1

「こんにちは、アミーゴ!」

「こんにちは、ビラーボ!」

「今日はマーカーインターフェースについてお話します。」

「マーカー インターフェイスはメソッドのないインターフェイスです。クラスがそのようなインターフェイスを実装するとき、クラスはそのインターフェイスによってマークされていると言います。」

「これらのインターフェイスの例には、Cloneable、Serializable、Remoteがあります。」

Serializableインターフェイスは、シリアル化をサポートするクラスをマークするために使用され、これらのクラスのインスタンスが自動的にシリアル化および逆シリアル化できることを示します。」

リモートインターフェイスは、リモート実行をサポートするオブジェクト、つまり別の Java 仮想マシンや別のコンピュータから呼び出すことができるメソッドを識別するために使用されます。」

Cloneableインターフェイスは、クローン作成をサポートするクラスをマークするために使用されます。」

「ああ、クローン作成、またはコピーについてです。」

「コピーには浅いコピーと深いコピーの 2 種類があります。」

浅いコピーとは、参照するオブジェクトの複製を作成せずに、オブジェクトのコピーを作成することです。」

ディープコピーには、オブジェクトが参照するオブジェクトや、それらのオブジェクトが参照するオブジェクトなどを含むオブジェクトの複製が含まれます。」

「ディープ クローンを確実に作成する非常に良い方法があります。」

「この方法は、開発者がクラスを Cloneable としてマークするのを忘れた場合でも機能します。唯一の要件は、オブジェクトがシリアル化可能である必要があることです。」

「その方法は次のとおりです。」

1)メモリ上にバッファ(バイト配列)を作成します。

2)オブジェクトとサブオブジェクトをバッファーにシリアル化します。

3)バッファに保存されたオブジェクト階層を逆シリアル化します。

コード
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();

「最初の行では、クローンを作成するobjectOriginalを作成します。オブジェクトとそのすべてのサブオブジェクトはシリアル化をサポートする必要があります。」

「3 行目で、ByteArrayOutputStreamを作成します。これは、(ArrayList のように) 新しいデータが追加されると動的に拡張されます。」

4 行目で、シリアル化に使用されるObjectOutputStreamを作成します。

5 行目では、outputStreamを使用してobjectOriginal をバイト配列にシリアル化し、 writeBuffer に保存します。

「8 行目で、 writeBuffer を通常のバイト配列に変換します。後で、この配列から新しいオブジェクトを「読み取り」ます。」

「9 行目では、 InputStream のようにバッファから読み取るために、バッファをByteArrayInputStreamに変換します。」

「10 行目では、 readBuffer をObjectInputStreamコンストラクターに渡して、オブジェクトを読み取り (逆シリアル化) します。」

「11 行目で、オブジェクトを読み取り、 BigObject に変換します

"どう思いますか?"

"美しい。"

「ところで、コードが異なる色で強調表示されると、非常に理解しやすくなります。」