6

私は java.Java でシリアライゼーションを読んでいますが、静的変数はオブジェクトと一緒にシリアライズされないと言われています。これは、「静的フィールドはシリアル化されない」という一般的なシリアル化ルールの 1 つの例外です。</p>

静的である理由を誰か教えてもらえますか?

4

6 に答える 6

6

オブジェクトが正常に作成されると、どのオブジェクト変数/メンバーにもアクセスできるためです。オブジェクト変数を作成せずにアクセスすることはできません。質問に戻りますが、逆シリアル化中に、データからオブジェクトを作成する必要があります。オブジェクトが逆シリアル化可能かどうかを確認する方法がない場合、オブジェクト メンバーを取得する方法はありません。

同じ理由で、UID は静的にします。

于 2013-07-25T05:27:59.803 に答える
1

serialVersionUID は、クラス インスタンスではなくクラス自体に適用されるため、静的です。ObjectOutputStream クラス記述子に保存されます。

于 2013-07-25T05:36:40.340 に答える
1

まず、 a が何をするかを理解する必要がserialVersionUIDあります。

からjava.io.Serializable:

シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信側と受信側が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを検証するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。

クラスserialVersionUIDの異なるバージョン間の互換性を決定します。プロパティはクラスにバインドされているため、作成する必要があります。static

于 2013-07-25T05:35:15.783 に答える
0

その serialVersionUID は、シリアライザーとデシリアライザーの両方に同じバイナリ バージョンがあり、古いバージョンで問題が発生しないことを確認するための規則です。また、デシリアライザーのさまざまな種類のクラスに同じ名前が付けられている場合もあるため、serialVersionUID は一種の一意の識別子のようなものです。

そのため、静的でなければならず (すべてのインスタンスではなく、「クラスにバインドされている」)、シリアル化されたデータと共に「送信」する必要があります。

于 2013-07-25T05:25:54.657 に答える
0

JRE によって静的であることが義務付けられているため、静的である必要があります。推論は簡単かもしれません。クラスのオブジェクトを実際に作成することなく、静的な方法でアクセスできます。

javadocsから:

シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信側と受信側が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを検証するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。シリアル化可能なクラスは、"serialVersionUID" という名前のフィールドを宣言することにより、独自の serialVersionUID を明示的に宣言できます。このフィールドは、静的、最終、および long 型である必要があります。

于 2013-07-25T05:27:19.003 に答える
0

シリアル化されるのは例外です。staticクラスのインスタンスではなく、クラスにバインドされているためだと思います。クラスのすべてのインスタンスは、同じ に準拠する必要がありますserialVersionUID。ここでも静的にするということは、オブジェクトを作成せずにランタイムが実際にその ID を取得できることを意味しますが、オブジェクトを逆シリアル化するための前提条件は ID を確認することです。オブジェクトがシリアライズされると、クラス名、オブジェクトの状態 (非静的メンバー変数)、およびserialVersionUIDが永続化されます。

于 2013-07-25T05:28:25.283 に答える