2016-08-31 3 views
3

シリアル化を遭遇するたびに、私たちの心はシリアルバージョンIDにジャンプします。 シリアル化APIごとに、シリアル化したい場合はオブジェクトを静的にすることはできません。どうすれば "serialiversionid"を静的にすることができますか?誰でも正確になぜシリアルバージョンIDが静的であるかをJavaで説明できます

プライベート静的最終長いのserialVersionUID = 1Lを次のように

署名です。

グーグルで次の情報があります。

デシリアライズ時に、データからオブジェクトを作成する必要があります。 オブジェクトがデシリアライズ可能かどうかをチェックする方法がない場合は、 オブジェクトメンバーを取得する方法はありません。

その他の情報は、デシリアライズでは例

答えて

2

と良いでしょう、Javaはどのタイプと次に来るのserialVersionUID見にストリームに見えます。これに基づいて、クラスローダーでクラス定義が参照され、ストリームから読み取られたデータを受け取るオブジェクトが作成されます。

ここで、ストリーム内の属性が、埋められる予定のオブジェクトの属性と一致するように、JavaはserialVersionUIDをチェックします。これは、のstaticである必要があります。これは、クラスローダーのクラス定義も静的であるためです。 Javaの同じクラスローダーで、シグネチャ(メンバー)を変更してモーフィングクラスを作成することはできません。

serialVersionUIDのチェックは、不完全なオブジェクトの初期化を防ぐ安全対策です。つまり、ストリームにメンバデータ(以前のコードバージョンで書かれています)が含まれていないが、現在のシグネチャ(およびオブジェクトコントラクト)何かに設定する。 may serialVersionUIDを変更しないことで、このような不完全な(直列化されていないメンバではない)ことを許可しますが、直列化解除時にメンバが残っていないことを確認したい場合は、serialVersionUIDをバンプ/変更する必要があります。

(たぶん良い雇用の面接の質問。私は資格あれば:-)しかし、わからない)

+0

ありがとうございます。それは非常に有用な説明です。私はあなたのものを撮影していればインタビューで資格があります:) – Pradeep

+0

'serialVersionUID'を変更することはほとんどありません。 'serialVersionUID'を変更せずにフィールドを十分に変更した場合に起こるように、部分的にではなく、シリアライゼーションを完全に中断することだけが達成されます。不幸な名前にもかかわらず、増分されるクラスのバージョン番号とはみなされません。 – EJP

1

それはないオブジェクトのクラスのプロパティであるため、それは静的です。そのような単純な。

オブジェクトでシリアル化される方法が不思議であれば、オブジェクトのクラスメタデータの一部として送信されます。クラスのメタデータは、クラスごとの接続ごとに1回だけ送信されます。

+0

情報をありがとう – Pradeep

関連する問題