web-dev-qa-db-ja.com

Java静的シリアル化ルール?

いくつかの静的メソッドとフィールドを使用して、状態の保存のシリアル化に取り組んでいます。私はそのシリアル化と静的が引き起こす騒乱を誓ったかもしれない。すべてのスタティックをトランジェントにする必要がありますか?そして、呼び出しを膨らませることで、通常どおり静力学が復元されますか?

35
ahodder

staticsは暗黙的にtransientであるため、そのように宣言する必要はありません。

シリアル化はインスタンスをシリアル化するためのものであり、クラスではありません。 staticフィールド(メソッドはクラス定義の一部であるためシリアル化されないため、メソッドは無関係です)は、クラスが読み込まれたときに設定された値に再初期化されます。

変更可能なstaticフィールドがある場合、その値に加えられた変更は失われます。

64
Robin

短いルールは次のとおりです。

1. static変数は、シリアル化中に保存されません。逆に、逆シリアル化プロセス中に、static変数はクラスレベルの初期化から開始されます。

2. staticおよびtransientキーワードベースの変数は、シリアル化時にどちらも無視されます。

3.クラス名とserialVersionUIDは両方ともバイトストリームとしてシリアル化され、逆シリアル化されると、ソースから読み取られたserialVersionUIDがローカルクラスの同じstatic変数と比較されます。これがserialVersionUIDstatic public finalとして宣言されているため、これらのバージョンUIDを比較するためにこれ以上オブジェクトを作成する必要はありません。

  • 万が一相違が見つかった場合は、InvalidClassExceptionが発生します。
4
Gagandeep

シリアル化では、staticフィールドは無視されます。

本来意図していたstaticではなくtransientと記載するように更新...

2
Brett Kail

staticフィールドはシリアル化されません。

1
ColinD

静的フィールドを「ser」ファイルの一部にすることはできません。スタティック+トランジェントはトランジェントと同じです。

0
Jatin Shashoo

「クラスのインスタンスをシリアル化する場合、保存されるのは非静的で非一時的なインスタンスデータのみです。クラス定義は保存されません。オブジェクトを逆シリアル化するときに使用できる必要があります」 http://Java.Sun.com/developer/technicalArticles/ALT/serialization/

0
Cris