2
class NotSerializable {}

class MyClass implements Serializable {
   private NotSerializable field; // class NotSerializable does not implement Serializable!!
}

public class Runner {
   public static void main(String[] args) {
      MyClass ob = new MyClass();

      try {
         FileOutputStream fs = new FileOutputStream("testSer.ser");
         ObjectOutputStream os = new ObjectOutputStream(fs);
         os.writeObject(ob);
         os.close();
      } catch (IOException e) { 
          e.printStackTrace(); 
      }

      try {
         FileInputStream fis = new FileInputStream("testSer.ser");
         ObjectInputStream ois = new ObjectInputStream(fis);
         MyClass copyOb = (MyClass) ois.readObject();
         ois.close();
      } catch (Exception e) { 
          e.printStackTrace(); 
      }
   }
}

このプログラムは正しく実行され、オブジェクトが正常にシリアル化されますob。しかし、実行時にjava.io.NotSerializableExceptionが発生すると予想していました。MyClassSerializable インターフェイスを実装していないクラスを参照しているためです。本当に何が起こっているのですか?

4

1 に答える 1

8

フィールドが null であるためです。null は正常にシリアライズできます。

シリアル化メカニズムは、宣言された型ではなく、各フィールドの実際の具象型をチェックします。NotSerializable のサブクラス、つまり Serializable のインスタンスを作成すると、それも正常にシリアル化されます。そうでない場合は、Serializable を実装していないListため、たとえば型のメンバーを持つオブジェクトをシリアル化することはできません。List

于 2013-07-16T18:49:27.110 に答える