java - Serializable で定義されたクラスをシリアル化できないのはなぜですか?
欧阳克
欧阳克 2017-06-30 09:56:37
0
2
1147

シリアル化可能クラスのフィールドは、クラスが明示的にシリアル化または逆シリアル化されない場合でも、それ自体がシリアル化可能または一時的である必要があります。これは、負荷がかかると、ほとんどの J2EE アプリケーション フレームワークがオブジェクトをディスクにフラッシュし、非一時的でシリアル化不可能なデータ メンバーを持つシリアル化可能とされるオブジェクトがプログラムのクラッシュを引き起こし、攻撃者への扉を開く可能性があるためです。

このルールは、シリアル化不可能なフィールド、およびコレクション フィールドがプライベートではない場合 (外部からシリアル化不可能な値が割り当てられる可能性があるため)、およびクラス内でシリアル化不可能な型が割り当てられている場合に問題を引き起こします。

違反コード例

リーリー

欧阳克
欧阳克

温故而知新,可以为师矣。 博客:www.ouyangke.com

全員に返信 (2)
扔个三星炸死你

オブジェクトがシリアル化される場合、Java のデフォルトのシリアル化ルールに従って、オブジェクト内のすべてのメンバーがシリアル化される必要があります。つまり、これらのクラスは Serializable を実装する必要があります。

したがって、これを変更するには 2 つの方法があります。1 つは、Address で Serializable インターフェイスを実装することです。もう 1 つは、メンバーがシリアル化されないようにtransientマークを Person のアドレス メンバーに追加することです。

いいねを押す+0
    typecho

    address メンバーをシリアル化する必要がある場合、Address クラスもSerializableインターフェイスを実装する必要があります。
    アドレス メンバーをシリアル化する必要がない場合は、transientキーワードを追加できます。その場合、アドレス メンバーはシリアル化されず、値は null になります。以下の通り:

    リーリー

    もちろん、他の方法もあります:
    たとえば、Externalizableインターフェースを実装し、readExternal(ObjectInput in) メソッドと writeExternal(ObjectOutput out) メソッドをオーバーライドします。
    Externalizableinterface メソッドの代替実装もあり、あるいは writeObject(ObjectOutputStream obs) メソッドと readObject(ObjectInputStream ois) メソッドを追加してSerializableinterface を実装することもできます。


    シリアル化するために、Address が

    Serializableを実装する必要があるのか、またはtransientキーワードpersonを追加する必要がある理由をもう一度教えてください。まず、
    ObjectOutputStreamを使用してオブジェクトを処理せずに永続化することによってスローされる例外を見てみましょうリーリー

    ObjectOutputStream

    ソースコードを見てください:リーリーこのことから、書き込まれているオブジェクト型が String、Array、Enum、または Serializable の場合はシリアル化できますが、それ以外の場合は NotSerializableException がスローされることがわかります。また、オブジェクトをシリアル化する場合、現在のオブジェクト自体がシリアル化されるだけでなく、そのオブジェクトによって参照される他のオブジェクトもシリアル化されます。

    いいねを押す+0
      最新のダウンロード
      詳細>
      ウェブエフェクト
      公式サイト
      サイト素材
      フロントエンドテンプレート
      私たちについて 免責事項 Sitemap
      PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!