オブジェクトのデフォルトのシリアライゼーション メカニズムは、オブジェクトのクラス、クラス シグネチャ、すべての非一時的および非静的フィールドの値を書き込みます。
- ここで「オブジェクトのクラス」と「クラス署名」に違いはありますか?
- 「Class Signature」と「Class」も渡されたので、JVM はデフォルト クラスをターゲット システムにロードしますか? (または) シリアル化されたオブジェクトで渡されるクラス?
オブジェクトのデフォルトのシリアライゼーション メカニズムは、オブジェクトのクラス、クラス シグネチャ、すべての非一時的および非静的フィールドの値を書き込みます。
「オブジェクトのクラスを書き込む」というフレーズは、実際には「オブジェクトのクラス名を書き込む」という意味です。Java オブジェクトのシリアル化では、クラスのバイトは書き込まれず、クラスの名前のみが書き込まれます。オブジェクトが後で逆シリアル化されるとき、現在の jvm で定義されたクラス バイトが使用されます。
ある種のシリアライズされたクラス定義を保存するのではなく、シリアライズしたインスタンスの内容だけを保存します。デシリアライズするとき、JVM はクラスパスで見つけたクラス定義を使用します。
したがって、バージョン管理がどのように機能するかを理解する必要があります...
「クラス署名」は、クラスの(およびシリアライズ可能なスーパークラスの)フィールド名とタイプ、およびシリアルバージョンの UID を参照することになっていると思います。
デフォルトでObjectInputStream
は、「最新」のクラス ローダー (つまり、コール スタックで最も近い非ブートストラップ クラス ローダー) でクラス名を検索します。指定されたクラス ローダーを使用した適切なサブクラスのルックアップ。RMI はデフォルトで (システム プロパティでオフにします)、ストリームに埋め込まれた注釈から新しいクラスをロードする場所 (URL) を見つけます。