私は java.Java でシリアライゼーションを読んでいますが、静的変数はオブジェクトと一緒にシリアライズされないと言われています。これは、「静的フィールドはシリアル化されない」という一般的なシリアル化ルールの 1 つの例外です。</p>
静的である理由を誰か教えてもらえますか?
私は java.Java でシリアライゼーションを読んでいますが、静的変数はオブジェクトと一緒にシリアライズされないと言われています。これは、「静的フィールドはシリアル化されない」という一般的なシリアル化ルールの 1 つの例外です。</p>
静的である理由を誰か教えてもらえますか?
オブジェクトが正常に作成されると、どのオブジェクト変数/メンバーにもアクセスできるためです。オブジェクト変数を作成せずにアクセスすることはできません。質問に戻りますが、逆シリアル化中に、データからオブジェクトを作成する必要があります。オブジェクトが逆シリアル化可能かどうかを確認する方法がない場合、オブジェクト メンバーを取得する方法はありません。
同じ理由で、UID は静的にします。
serialVersionUID は、クラス インスタンスではなくクラス自体に適用されるため、静的です。ObjectOutputStream クラス記述子に保存されます。
まず、 a が何をするかを理解する必要がserialVersionUID
あります。
シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信側と受信側が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを検証するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。
クラスserialVersionUID
の異なるバージョン間の互換性を決定します。プロパティはクラスにバインドされているため、作成する必要があります。static
その serialVersionUID は、シリアライザーとデシリアライザーの両方に同じバイナリ バージョンがあり、古いバージョンで問題が発生しないことを確認するための規則です。また、デシリアライザーのさまざまな種類のクラスに同じ名前が付けられている場合もあるため、serialVersionUID は一種の一意の識別子のようなものです。
そのため、静的でなければならず (すべてのインスタンスではなく、「クラスにバインドされている」)、シリアル化されたデータと共に「送信」する必要があります。
JRE によって静的であることが義務付けられているため、静的である必要があります。推論は簡単かもしれません。クラスのオブジェクトを実際に作成することなく、静的な方法でアクセスできます。
javadocsから:
シリアル化ランタイムは、シリアル化可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアル化されたオブジェクトの送信側と受信側が、シリアル化に関して互換性のあるそのオブジェクトのクラスを読み込んでいるかどうかを検証するために、逆シリアル化中に使用されます。受信者が、対応する送信者のクラスとは異なる serialVersionUID を持つオブジェクトのクラスをロードした場合、逆シリアル化により InvalidClassException が発生します。シリアル化可能なクラスは、"serialVersionUID" という名前のフィールドを宣言することにより、独自の serialVersionUID を明示的に宣言できます。このフィールドは、静的、最終、および long 型である必要があります。
シリアル化されるのは例外です。static
クラスのインスタンスではなく、クラスにバインドされているためだと思います。クラスのすべてのインスタンスは、同じ に準拠する必要がありますserialVersionUID
。ここでも静的にするということは、オブジェクトを作成せずにランタイムが実際にその ID を取得できることを意味しますが、オブジェクトを逆シリアル化するための前提条件は ID を確認することです。オブジェクトがシリアライズされると、クラス名、オブジェクトの状態 (非静的メンバー変数)、およびserialVersionUID
が永続化されます。