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

シリアル化可能クラスのフィールドは、クラスが明示的にシリアル化または逆シリアル化されない場合でも、それ自体がシリアル化可能または一時的である必要があります。これは、負荷がかかると、ほとんどの 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 学習者の迅速な成長を支援します!