2017-07-09 11 views
0

親クラスのシリアライズを防ぐ方法はありますか?親クラスのシリアライゼーションを防止するJava

サブクラスを親クラスまで逐次シリアライズすると、シリアライズが実行されます。

親クラスのシリアル化を制限し、私が取り組んでいる唯一のサブクラスを直列化できますか?

+0

サブクラスのインスタンスは、最初にベースクラスを構築することで構築されます。なぜ、サブクラスのみを直列化し、ベースクラスを直列化したくないのでしょうか? – JRG

+0

あなたの情報:私はあなたのアイデアを拒否した理由を明確にするために私の答えを言い換えました。あなたがそれが役に立つと分かったら教えてください。 – GhostCat

答えて

3

です。あなたのクラスをimplements Externalizableと宣言して、writeExternal()メソッドで必要なものを正確に書いてください。スーパークラスから何かをシリアル化しないように注意し、メソッドでそれを正確に読んでください。

それとも、だけSerializableを実装して、独自のreadObject()/writeObject()方法を提供し、再びスーパークラスから何かをシリアル化しないように注意しながら、この場合にも、defaultWriteObject()またはdefaultReadObject()を呼び出していません。

どちらの場合でも、現在のクラスのデータの実際のシリアル化は、あなた次第です。

0

スーパークラスのフィールドを除外しても、各レベルの継承を独自に微調整することは技術的に可能ですが、ここに戻ってください。

は基本的に2つのケースがあります。

  1. スーパークラスは、任意のフィールド/状態を持っていません。とにかく排除するものはありません。
  2. スーパークラスには、そのクラスのフィールドで表される状態があります。

どのようにして2番目の部分に有意義に対処すると思いますか?スーパークラスフィールドのデータなしで非直列化を許可すると、多くの追加テストが必要になることがあります。スーパークラスメソッドが例外をスローしないようにするには - 突然のフィールドはすべて初期化されるのではなくヌルであるためです。

他の言葉では、これらすべての値を「除外」する可能性があります。全く異なる動作をするオブジェクトを作成している可能性があります。あなたはそのすべての効果を処理する準備ができていますか?

意味:スーパークラスフィールドをスキップするには、シリアル化コードを妨害する必要があります。多くの追加のテスト作業が必要になることがあります。そしてあなたは何を得ますか?実行時にデータ転送が数バイト少なくなります。

それ以外:4レベルを持つ無差別階層の目的は何ですか?ただし、スーパークラスの状態は無関係ですか?

私の無回答:基本的な要件を解決するには、あなたのアイデアが実際のOO設計であるかどうかを慎重に検討してください。

+0

私が使用しているサブクラスは継承レベルが4です。シリアライズするために私はサブクラスで保持されているデータのみを心配しています。シリアル化中にサブクラスの継承階層全体をダンプしたくありません – now30

+1

私の更新を見てください。しかし、再び - あなたが求めていることはあまり意味がありません。それを越えて - 4つの祖先クラスはそれ自身で悪いデザインの匂いを持っています。 – GhostCat

+0

Agreed.But私はクラス階層のコントロールがありません。私はサブクラスを持つ必要があるように、私はstiplulatedデザインごとにやっています。しかし、親クラスの直列化を防ぐ方法がない場合は、製図板 – now30

関連する問題