2012-04-29 9 views
4

シリアル化可能なインタフェースの使用方法は何ですか、私はそれを調べ、Javaが内部的にこれを使用する多くの書籍を読み込みましたが、これ以上説明されていません。 interfaceこれはマーカーインターフェイスであり、本体には何もありません。このインターフェイスを実装していない場合は、オブジェクトをシリアル化しません。コアJavaのシリアル化可能なインタフェースについての簡単なクエリ

+1

あなたの質問が何であるかはあまり明確ではありません。なぜなら、あなたはそのインターフェイスが正確に何かを得ているように思われるからです。単なるタグであり、シリアライズに必要なタグです。具体的に何を理解していないのですか? – Mat

+0

ちょっと、私は、任意のインターフェイスにボディがない場合私はなぜ私たちはそのインターフェイスを実装する必要があります取得していない場合は、私はそのインターフェイスを実装していない場合は任意のperticularクラスは、 )しかし、私たちはシリアライズ可能なオブジェクトを直列化する必要があることを知っています。私はあなたが尋ねたいものを得るでしょう... –

+0

オブジェクトがデフォルトで直列化可能だった場合、望ましくないクラスをマークする方法が必要ですシリアライズ可能で、特別なマーカーが必要になりますそのインターフェイスは、開発者が「このクラスを正しくシリアル化できる」ことを示すために必要です。 – Mat

答えて

3

Serializableインターフェイスはマーカーインターフェイスです。これは何を意味するのでしょうか?まあ、オブジェクトをシリアル化するために、次のようなコードを使用します。

final Foo interestingObject = new Foo(42); 
final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); 

oos.writeObject(interestingObject); 
oos.close(); 

あなたはObjectOutputStreamにオブジェクトを渡すと、それはいくつかのことを行うためにリフレクションを使用しています。まず、渡されたオブジェクトがSerializableを実装しているかどうかをチェックします。そうでない場合、writeObject()NotSerializableExceptionをスローします。次に、ObjectOutputStreamがオブジェクトのシリアル化を決定した後、オブジェクトの内容を反射的に調べ、フィールドのそれぞれを再帰的にシリアル化します(staticフィールドとtransientとしてマークされたフィールドを除く)。

このように、このオブジェクトはにシリアル化されるべきであることを示す方法です。明示的にクラスをシリアライズできると明示していない場合は、ObjectOutputStreamはシリアライズを試みません。しかし、ObjectOutputStreamは、問題のオブジェクトの内部を調べるためにリフレクションを使用するため、Serializableインターフェイスはメソッドを指定する必要はありません。ObjectOutputStreamメソッドを呼び出す必要はありません。

(これはとにかく簡略化されたバージョンです。定義できる特定のシグネチャを持つ一連のメソッドがあり、存在する場合はシリアライゼーションメカニズムによって呼び出されます)。ObjectOutputStream Javadocを参照してください。

1

あなたの質問に答えがあります - 「マーカーインターフェイスです」これは、オブジェクトグラフのすべてがSerializableであることを確認し、そうでないものが見つかった場合に例外をスローするシリアライゼーションメカニズムのヒントにすぎません。その理由は、基本的にすべてのオブジェクトがシリアル化されていますが、すべてが意味をなさないので、はシリアル化します(例えば、Socketはネイティブファイル記述子を格納します - それを直列化して別のマシンに送信してデシリアライズすれば、 )。したがって、シリアル化する必要があるのは開発者によって決定されなければならず、開発者はSerializableを実装して決定を明示します。

0

実用的な例を使って説明したいと思います。私はあなたと同じように多くの時間にわたって、シリアライゼーションを完全に理解しています。

最初に、オンラインのユーザーが表示されないアプリケーションを開発したいと考えています。私はtomcatクラスタ環境を使用しています。

私が行ったことは、ユーザーがログインするときにマップを作成したことです。ユーザーIDをマップに挿入し、地図を繰り返してオンラインユーザーリストを表示します。今の主な問題は、最初のユーザーはtomcat 1を介してログインし、2番目のユーザーはtomcat 2を介してログインします。この場合、jvmによって作成されたtomcat 1とtomcat 2のマップの2つの異なるオブジェクトが表示されます。ユーザーは適切にオンラインになります。

1.マップをシリアライズ可能なファイルに書き出し、マップにデータが存在しないかどうかをチェックします。ファイルに書き込む場合、データがあればファイルからデータを読み込み、マップに配置します。

主にserializableを使用すると、ネットワーク上のデータを送信するときに、オブジェクト状態をファイルに変換します。

関連する問題