4

シリアル化可能なインターフェイスの使用とは何か教えてください。グーグルで調べて、Javaが内部的にこれを使用していることを多くの本で読みましたが、これ以上説明されていませんでしたが、シリアル化可能なインターフェイスを見ると、それはマーカーインターフェイスであり、何もありませんこのインターフェイスを実装しない場合、オブジェクトをシリアル化していません。

4

3 に答える 3

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を呼び出す必要もありません。

(いずれにせよ、これは単純化されたバージョンです。定義できる特定の署名を持つメソッドも多数あり、シリアル化メカニズムはそれらが存在する場合はそれらを呼び出します。興味がある場合は、ObjectOutputStreamJavadocを読んでください。)

于 2012-04-29T10:06:38.820 に答える
1

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

于 2012-04-29T10:07:29.537 に答える
0

実用的な例を使用して説明したいと思います。私もあなたと同じで、シリアル化を完全に理解するために何度もグーグルで検索しました。

最初に、オンラインのユーザーを表示するアプリケーションを開発したいというシナリオを考えてみましょう。Tomcat クラスター環境を使用しています。

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

上記の問題1を解決するには、マップをシリアル化可能なファイルに書き込み、マップにデータが存在しないかどうかを確認し、ファイルに書き込み、データがある場合はファイルからデータを読み取ってマップに配置します。

シリアライズ可能の主な用途は、ネットワーク上でデータを送信するときにオブジェクトの状態をファイルに変換することです。

于 2014-09-19T12:38:07.020 に答える