3

とマークされているのに、なぜシリアライズされているtableのですか?Hashtabletransient

4

3 に答える 3

7

Entry 配列でデフォルトのシリアライゼーション スキームを使用するのは安全ではないため、一時的なものとしてマークされています。むしろ、Hashtable がデシリアライズされるときは、テーブル内のキーを再ハッシュし、新しいハッシュコード値に従ってエントリをスロットに追加する必要があります。これは、さまざまな理由により、デシリアライズ後にキーのハッシュコードが異なる可能性があるため必要です。この作業は Hashtable のreadObject()方法で行います。

于 2010-03-26T15:02:49.503 に答える
1

writeObject()(プライベート メソッドでreadObject()) 実装されているため、シリアル化および逆シリアル化の方法を制御できます。Java 1.6 ソースコードの 800 行目あたりです。

「ボンネットの下」でどのように機能するかの詳細については、このSun の高度なシリアライゼーション ガイドを確認してください。

于 2010-03-26T15:00:01.253 に答える
1

Hashtable クラス (少なくとも 1.6) のソース コードを見ると、Entry[] tableは としてマークされてtransientいますが、クラスは を実装writeObject()しており、エントリ テーブルの内容をObjectOutputStream.

したがって、Hashtable の内容は常にシリアル化されます。

なぜ彼らはこのように実装することを選択したのですか? 配列のシリアル化方法を制御できる可能性があります。

于 2010-03-26T15:00:52.503 に答える