2016-11-16 2 views
0

オブジェクトをファイルに保存するためにJava直列化を使用しています。私はオブジェクトが変更されたかどうかを確認するためにhashCode()を使用しているので(オブジェクトのhashCodeをメモリに保存する前にオブジェクトのハッシュコードを変更することができます)私はメモリから読み込んだ後に取得するものとは異なるでしょうか?)シリアル化後のJavaハッシュコードの変更

私のオブジェクトに別のオブジェクトを指す変数_myOtherObjectがある場合、メモリから読み込んだ後、_myOtherObjectがおそらく別のメモリアドレスに格納され、_myOtherObjectの値が変更され、メモリからロードしたオブジェクトのハッシュコードを変更します。私の考えは正しい?

ありがとうございました。

+1

オブジェクトのハッシュコードをどのように計算するかによって異なります。コードを投稿できますか? –

+0

あなたの最後の質問には、答えは "それはあなたがハッシュコードを計算する方法に依存します"です。それは変わるかもしれないが、必ずしもそうではない。 –

答えて

1

ハッシュコードの計算方法によって異なります。しかし、計算にObject.hashCode()またはSystem.identityHashCode(Object)を使用する場合は、おそらく変更されます。

これらのハッシュは、オブジェクトIDとオブジェクト参照==セマンティクスに基づいています。逆シリアル化されたオブジェクトは元のオブジェクトと異なる識別情報を持ち、==になりません。したがって、ハッシュコードは異なる可能性があります。


第二の問題は、あなたがシリアライズと(ライブラリクラスの異なるバージョンを含む)クラスの異なるバージョンをデシリアライズする場合、それは別のハッシュコードかかわらず上記のアイデンティティの問題の中につながる可能性があることです。 ほとんどの場合ケースでは、ライブラリクラスのハッシュコードを計算するアルゴリズムはAPI仕様の一部ではありません。

関連する問題