2017-12-21 17 views
1

BBは、Bの親です。 Aはスタンドアロンクラスです。私がこのコードでやっているのは、タイプBのオブジェクトをファイルに書き込んだ後にそれを読み取ることだけです。継承付きシリアル化可能

このコードは正常に動作します。さらに、クラスがSerializableの場合、そのサブクラスは自動的にSerializableになります。

これを念頭に置いて、Bがシリアル化可能ではなく、BB(その親)がNotSerializableExceptionになるのはなぜですか?どちらの場合も同じ出力が期待されます。

public class Main { 
     public static void main(String[] args) { 
      B bb = new B(); 
      B bb2 = null; 
      try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("text.ser")); 
       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("text.ser"))){ 
       oos.writeObject(bb); 
       bb2 = (B) ois.readObject(); 
      }catch(Exception e){e.printStackTrace();} 
     } 
    } 

    class A { 
     int a = 1, hello=7; 
     A() {a = 2;} 
     } 

    class BB { 
     int bb = 1; 
     A aInstance = new A(); 
     BB() {bb = 2;} 
    } 

    class B extends BB implements Serializable{ 
     int b = 1; 
     B() {b = 2;} 
    } 

答えて

4

BBタイプAのフィールドを持ち、そしてASerializableを実装していません。直列化可能クラスでは、すべてのフィールドの型は直列化可能でなければならず、型のフィールドの型なども必要です。

また

(あなたはおそらくこれをしたくないが)、あなたはシリアル化から除外されるようにフィールドを宣言するtransientキーワードを使用することができます。

transient A aInstance = new A(); 

あなたがこれを行う場合は、aInstanceがされますnullBまたはBBインスタンスが非シリアル化された場合でも、インスタンスがシリアル化されたときにフィールドがnullであっても、

関連する問題