シリアライゼーション ID はオブジェクトのインスタンスにどのように格納されますか?
Java で宣言するシリアル化 ID は静的フィールドです。静的フィールドはシリアル化されません。
その場合、静的最終フィールドを格納する方法がいくつかあるはずです。Javaはどのようにそれを行いますか?
シリアライゼーション ID はオブジェクトのインスタンスにどのように格納されますか?
Java で宣言するシリアル化 ID は静的フィールドです。静的フィールドはシリアル化されません。
その場合、静的最終フィールドを格納する方法がいくつかあるはずです。Javaはどのようにそれを行いますか?
serialVersionUIDは静的フィールドであるため、「シリアル化された」オブジェクトのインスタンスには格納されません(オブジェクトの一部ではなく、クラスの一部です)。
したがって、stored
実際に定義されている場合はコンパイルされたバイトコードにあり、そうでない場合は計算されます。Java仕様の言葉で:
クラスが serialVersionUID を定義している場合、それはクラスから取得されます。serialVersionUID がクラスで定義されていない場合、仮想マシンのクラスの定義から計算されます。>指定されたクラスがシリアライズ可能または外部化可能でない場合、null が返されます。
Stream Unique Identifiers セクションでは、このような計算のアルゴリズムについて説明します。
このパラグラフは注目に値します (これが、Serializable を実装するクラスが明示的に serialVersionUID を定義していない場合に IDE が通常警告を表示する理由です)。
注: デフォルトのserialVersionUID 計算は、コンパイラの実装によって異なる可能性があるクラスの詳細に非常に敏感であり、逆シリアル化中に予期しない serialVersionUID 競合が発生し、逆シリアル化が失敗する可能性があるため、すべてのシリアル化可能なクラスで serialVersionUID 値を明示的に宣言することを強くお勧めします。
そこを見るjava.io.ObjectStreamClass
と、実際にシリアル化されていることがわかります。次の方法:
java.io.ObjectOutputStream.writeClassDescriptor(ObjectStreamClass)
次のメソッドを呼び出すメソッドを呼び出します。
java.io.ObjectStreamClass.getSerialVersionUID()
これは、を計算するserialVersionUID
か、クラスで宣言され、次のメソッドの呼び出しで以前に見つかったものを使用します。
java.io.ObjectStreamClass.getDeclaredSUID(Class)
したがって、この静的フィールドは、静的フィールドがシリアル化されないという規則の例外のようです。
読み方はこちらです。
シリアル バージョンの UID はオブジェクトに保存されません。これは静的フィールドであるため、クラス定義に格納されます。オブジェクトをシリアル化すると、そのクラスに関する情報も保存する必要があります。そうしないと、オブジェクトのシリアル化を解除する方法がありません。クラスに関して格納されている情報には、その名前とシリアル バージョンの UID が含まれます。
ここでプロトコル全体を読むことができます: http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html
要約すると、新しいオブジェクトのエントリは次のとおりです。
newObject:
TC_OBJECT classDesc newHandle classdata[]
これclassDesc
は、新しいクラスの宣言、null 参照、または以前に宣言されたクラスへの参照のいずれかになるクラスの記述子です。
classDesc:
newClassDesc
nullReference
(ClassDesc)prevObject
新しいクラスの宣言は、クラスの名前とシリアル バージョンの UID、後でそれを参照するために使用できるハンドル、および次のようにエンコードされたクラスに関する追加情報を確立しますclassDescInfo
。
newClassDesc:
TC_CLASSDESC className serialVersionUID newHandle classDescInfo
これserialVersionUID
は、シリアライゼーション ランタイムによって使用される特別なフィールドです。それはすべてjava.lang.Serializableの Java Doc で説明されています