2012-01-01 2 views
0

動作しません:私が持つNotSerializableException appears.The Viewオブジェクトは、いくつかの他のオブジェクトが含まれており、I out.writeObject(view);ラインに到達すると持つNotSerializableException例外は常に(Javaの)表示されます - シリアル化は、次のコードを考える

import java.io.*; 

public class Main { 


    public static void main(String argv[]) throws IOException 
     { 

     View view = null; 

      try 
      { 
       /* Open the file that is the first command line parameter 
       text file must be inside the project library , not in the src library */ 

       FileInputStream fstream = new FileInputStream("input.txt");        
       DataInputStream in = new DataInputStream(fstream); 
       BufferedReader groupsFile = new BufferedReader(new InputStreamReader(in));    

       view = new View(); 
       view.insertTeamsFromFile(groupsFile); 
       view.startCompetition();     
       in.close(); 
      } 

      //Catch exception if any 
      catch (Exception e) { System.err.println("Error: " + e.getMessage());  } 


     try 
     { 

      String filename = "view.txt"; 
      FileOutputStream fos = new FileOutputStream(filename); 
      ObjectOutputStream out = new ObjectOutputStream(fos); 
      out.writeObject(view); 
      out.close(); 
      System.out.println("Object Persisted"); 
     } 

     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     } 
} 

をそのコード内のファイルから入力を読み込みます。 Viewオブジェクトがうまく作成されていると仮定します。何が問題なのでしょうか?

View class : 

    public class View implements Serializable { 
import java.io.*; 
import java.util.*; 


     /* Constructor */ 


     private Controller controller; 

     public View() 

     { 
      controller = new Controller(); 
     } 

      ... ... 
      // more code 

    } 

正確なメッセージは次のとおりです。

java.io.NotSerializableException: core.Controller 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
    at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 

ここで間違っているのですか?

よろしく、ロン

+1

さて、 'core.Controller'はシリアル化可能ですか?そうではないようです。なぜあなたはこの例外に驚いていますか? – Mat

+1

エラーメッセージは十分にクリアです。 'Controller'クラスは' Serializable'も実装しなければなりません。実際、 'View'がフィールドとして持っているすべてのクラスと、それらのクラスのそれぞれがフィールドとして持っているすべてのクラスなどは、' Serializable'を実装しなければなりません(あるいは 'transient'として宣言されなければなりません)または同様のエラーメッセージが表示されます。 – aroth

答えて

1

例外メッセージは非常に明確です。core.Controllerクラスはシリアル化できません。 Serializableを実装するか、シリアル化しない場合はtransientと宣言します。

+0

コントローラをトランジェントにする必要がありますか?私はViewのプライベートフィールドとして使う究極のクラスがControllerであるコード内で多くの継承を使用します。すべてのクラスを一時的にする必要がありますか? – ron

+0

あなたが何を求めているのか分かりません。ビューのシリアライズ時にコントローラをシリアライズし、コントローラをシリアライズ可能にするか、ビューをシリアライズするときにコントローラをシリアル化しないようにし、Viewクラスのコントローラフィールドを次のように宣言する必要がありますtransientキーワード –

+0

コントローラが 'View'内の唯一のアトリビュートである場合、' transient'にしてもそれほどシリアライズすることはありません:-) – rsp

1

SerializableController実装していますか? ViewおよびControllerのすべてのフィールドは、それらが直列化可能であることを宣言する必要があります。

関連する問題