web-dev-qa-db-ja.com

クラスがシリアル化可能であるにもかかわらず、HashMapのハッシュテーブルが一時的なものとしてマークされるのはなぜですか

HashMap のソースを調べていました。

HashMapimplements Serializable

これは、オブジェクトとして永続化/送信できるようにするためです。

しかし、ハッシュテーブル自体がtransientとしてマークされているのがわかります。

これを取得できません。一時的なものとしてマークした場合、これはシリアル化する必要があることを意味します?

しかし、すべてのデータが表に含まれています。では、なぜtransientなのでしょうか。

多分私はSerializableがどのように機能するのか混乱していますか?

24
Cratylus

HashMapは、フィールドを通常どおりシリアル化するだけでなく、writeObjectおよびreadObjectを使用してカスタムシリアル化を実装します。バケットの数、合計サイズ、各エントリをストリームに書き込み、逆シリアル化されたときにそれらのフィールドから自分自身を再構築します。 tzamanが言うように、テーブル自体はシリアル形式では不要なので、スペースを節約するためにシリアル化されません。

これらのメソッドおよびカスタムシリアル化を行う他のいくつかのメソッド(writeReplaceおよびreadResolve)の詳細については、 Serializable javadocを参照してください。

33
ColinD

transientキーワードは、フィールドをクラスのシリアル化された表現に含めないことを示します。 Entry[]HashMapのテーブルは、単なる加速構造です。これにより、格納されたエントリをすばやく検索できます。エントリのリストから逆シリアル化するときにテーブルを再構築できるため、テーブル全体をシリアル化する必要はなく、テーブルに含まれるエントリのみをシリアル化する必要があります。

13
tzaman