とマークされているのに、なぜシリアライズされているtable
のですか?Hashtable
transient
3 に答える
Entry 配列でデフォルトのシリアライゼーション スキームを使用するのは安全ではないため、一時的なものとしてマークされています。むしろ、Hashtable がデシリアライズされるときは、テーブル内のキーを再ハッシュし、新しいハッシュコード値に従ってエントリをスロットに追加する必要があります。これは、さまざまな理由により、デシリアライズ後にキーのハッシュコードが異なる可能性があるため必要です。この作業は Hashtable のreadObject()
方法で行います。
writeObject()
(プライベート メソッドでreadObject()
) 実装されているため、シリアル化および逆シリアル化の方法を制御できます。Java 1.6 ソースコードの 800 行目あたりです。
「ボンネットの下」でどのように機能するかの詳細については、このSun の高度なシリアライゼーション ガイドを確認してください。
Hashtable クラス (少なくとも 1.6) のソース コードを見ると、Entry[] table
は としてマークされてtransient
いますが、クラスは を実装writeObject()
しており、エントリ テーブルの内容をObjectOutputStream
.
したがって、Hashtable の内容は常にシリアル化されます。
なぜ彼らはこのように実装することを選択したのですか? 配列のシリアル化方法を制御できる可能性があります。