シリアル化可能なインターフェイスの使用とは何か教えてください。グーグルで調べて、Javaが内部的にこれを使用していることを多くの本で読みましたが、これ以上説明されていませんでしたが、シリアル化可能なインターフェイスを見ると、それはマーカーインターフェイスであり、何もありませんこのインターフェイスを実装しない場合、オブジェクトをシリアル化していません。
3 に答える
Serializable
インターフェイスはマーカー インターフェイスのみです。これは何を意味するのでしょうか?オブジェクトをシリアル化するには、次のようなコードを使用します。
final Foo interestingObject = new Foo(42);
final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(interestingObject);
oos.close();
オブジェクトを に渡すと、ObjectOutputStream
リフレクションを使用していくつかのことを行います。まず、渡されたオブジェクトが implements かどうかをチェックしますSerializable
。そうでない場合は、writeObject()
をスローしNotSerializableException
ます。次に、ObjectOutputStream
がオブジェクトをシリアル化する必要があると判断した後、オブジェクトの内容を反射的に調べ、各フィールドを再帰的にシリアル化します (static
フィールドおよび としてマークされたフィールドを除くtransient
)。
ご覧のとおり、インターフェースは、このオブジェクトをシリアライズする必要があることを示す方法です。クラスをシリアル化できると明示的に言わない場合、 はそれObjectOutputStream
をシリアル化しようとしません。しかし、ObjectOutputStream
はリフレクションを使用して問題のオブジェクトの内部を調べるため、Serializable
インターフェイスはメソッドを指定する必要がなく、特定のメソッドObjectOutputStream
を呼び出す必要もありません。
(いずれにせよ、これは単純化されたバージョンです。定義できる特定の署名を持つメソッドも多数あり、シリアル化メカニズムはそれらが存在する場合はそれらを呼び出します。興味がある場合は、ObjectOutputStream
Javadocを読んでください。)
答えはあなたの質問にあります-「それはマーカーインターフェースです」。これはシリアライゼーション メカニズムの単なるヒントであり、オブジェクト グラフ内のすべてのものが正しいことを確認し、Serializable
そうでないものが見つかった場合に例外をスローします。その理由は、基本的にすべてのオブジェクトをシリアル化できますが、すべてをシリアル化する意味があるわけではないためです(たとえば、Socket
ネイティブ ファイル記述子を保存します。それをシリアル化し、別のマシンに送信し、そこで逆シリアル化すると、まったく役に立たなくなります)。したがって、何をシリアル化するかは開発者が決定する必要があり、開発者は を実装することでその決定を明示しますSerializable
。
実用的な例を使用して説明したいと思います。私もあなたと同じで、シリアル化を完全に理解するために何度もグーグルで検索しました。
最初に、オンラインのユーザーを表示するアプリケーションを開発したいというシナリオを考えてみましょう。Tomcat クラスター環境を使用しています。
私がやったことは、ユーザーがログインしたときにマップを作成したことです。ユーザーIDをマップに挿入し、マップを繰り返してオンラインのユーザーのリストを表示します。ここでの主な問題は、最初のユーザーが tomcat 1 を介してログインし、2 番目のユーザーが tomcat 2 を介してログインすることです。この場合、jvm によって作成された tomcat 1 と tomcat 2 に 2 つの異なるマップ オブジェクトが存在するため、表示できません。ユーザーが正しくオンラインになっている。
上記の問題1を解決するには、マップをシリアル化可能なファイルに書き込み、マップにデータが存在しないかどうかを確認し、ファイルに書き込み、データがある場合はファイルからデータを読み取ってマップに配置します。
シリアライズ可能の主な用途は、ネットワーク上でデータを送信するときにオブジェクトの状態をファイルに変換することです。