はい (構造があまり変わらず、特定のルールに従っている限り)。ファイルに次のシリアル化された表現が含まれているとします。
class Foo
{
int a; // value = 42
String b; // value = "don't panic"
}
ただし、オブジェクトを変更Foo
したため、クラス定義は次のようになりました。
class Foo
{
int a;
String b;
char c;
}
ファイルを読み込むと、シリアライゼーション メカニズムが自動的に のインスタンスFoo
を存在させ、a を 42 に、b を「パニックにならない」に設定します。の値c
がストリームになかったので、デフォルトで、Java のデフォルト値 (この場合、char の場合は 0x0000) に設定されます。
これでオブジェクトができたので、次の値を設定できますc
。
foo.c = 'Z';
オブジェクトをシリアル化してファイルに書き込むと、ファイルには次のシリアル化された表現が含まれます。
class Foo
{
int a; // value = 42
String b; // value = "don't panic"
char c; // value = 'Z'
}
上で見たようc
に、オブジェクト ストリームで見つからなかったときにデフォルト値が与えられました。別のデフォルト値を定義したい場合があります。シリアライゼーション メカニズムは、シリアライズ/デシリアライズ時にカスタム コードを実行する方法を提供します。詳細については、SerializableのJavadoc を参照してください ( の説明を参照してくださいreadObject()
)。
編集: JB Nizet が指摘しているように、 と呼ばれる特別なシリアル化フィールドがありserialVersionUID
ます。オブジェクトのバージョン ID がオブジェクト ストリームの内容と一致することを確認する必要があります。次のようにオブジェクトに明示的に設定できます。
private static final long serialVersionUID = 1L;
ただし、最初に指定しなかった場合は、フィールドとメソッド シグネチャのハッシュからアルゴリズム的に生成された値を使用して自動的に書き出されます。この番号を再生成する必要がある場合 (クラスで定数として定義できるようにするには、serialverツールを使用する必要があります。