Java にクラスがあり、データを保存し、オブジェクトを取得してシリアル化し、それをファイルに保存したとします。また、まったく同じクラスの別のプロジェクトがありますが、別のファイルで定義されていました。保存したファイルを取得して、そのプロジェクトでシリアル化を解除することはできますか?
5 に答える
クラス名とserialVersionUID
が同じである限り、これはうまくいくはずです。
はい、それぞれのプロジェクトが問題のクラスに対して同じ(または互換性のある)「.class」ファイルを持っていると仮定すると、うまくいきます。
オブジェクトをシリアル化してから逆シリアル化すると、基本的にそのコピーが作成されます。シリアル化してから逆シリアル化すると、オブジェクト ID は保持されません。保存されるのは、オブジェクトの状態と、シリアル化された他のオブジェクトとの関係です。
これを次のように対比してください。
直交永続性 - オブジェクトが 1 つだけであることをシステムが保証します。
オブジェクト リレーショナル マッピング - メモリ内に複数のレプリカが存在する可能性がありますが、システムはそれらをデータベース内に存在する「マスター」コピーと同期できます。
これは、シリアライゼーションが設計されているものです。これにより、ある Java アプリから、異なる JVM および異なるコンピューターで動作する別の Java アプリにオブジェクトを渡すことができます。これは、ファイル、ネット、または DB を介して行うことができます。
serialVersionUIDを指定すると、それが可能になります。
UPD:ストリーム固有の識別子は、クラス名、インターフェイス クラス名、メソッド、およびフィールドの 64 ビット ハッシュです。
したがって、クラスが異なるインターフェースを実装している場合、問題に直面するはずです。シリアル化可能なクラスに serialVersionUID を指定することは、どのような方法でも良い方法です。
注 - デフォルトの serialVersionUID 計算は、コンパイラの実装によって異なる可能性があるクラスの詳細に非常に敏感であり、逆シリアル化中に予期しない serialVersionUID 競合が発生し、逆シリアル化が失敗する可能性があるため、すべてのシリアル化可能なクラスで serialVersionUID 値を明示的に宣言することを強くお勧めします。
まったく同じクラスの別のプロジェクトがありますが、別のファイルでまだ定義されていました。
言い換えれば、ソース コードが同じパッケージ内にあると宣言されていない限り、ほぼ確実に別のクラスです。2 つの異なるパッケージ内の同様のソース コードは、同じクラスではなく、2 つの異なるクラスであり、一方を他方のように逆シリアル化することはできません。