2012-01-01 20 views
0

考慮下面的代碼:NotSerializableException異常總是出現(爪哇) - 序列化將無法工作

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(); 
     } 

     } 
} 

當我站上罰球線out.writeObject(view);的NotSerializableException appears.The查看對象包括一些其他的對象,我從該代碼中的文件讀取輸入。假設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 2012-01-01 11:44:20

+1

錯誤消息已足夠清晰。 'Controller'類也必須實現'Serializable'。事實上,View的每個類都有一個字段,每個類都有一個類作爲一個字段,等等貫穿整個層次,必須實現'Serializable'(或者聲明爲'transient')或者你會得到一個類似的錯誤信息。 – aroth 2012-01-01 11:46:21

回答

1

異常消息非常明確:core.Controller類不可序列化。如果它不能被序列化,則執行Serializable或聲明它爲transient

+0

我真的需要讓控制器瞬態?我在我的代碼中使用了很多繼承,我用作View的專用字段的最終類是Controller。我是否需要暫時性所有課程? – ron 2012-01-01 11:48:13

+0

我不明白你在問什麼。要麼當序列化視圖時要控制器序列化,然後控制器必須是可序列化的,或者當序列化視圖時不希望控制器序列化,並且View類中的控制器字段必須聲明爲瞬態關鍵字。 – 2012-01-01 11:51:29

+0

如果控制器是'View'中唯一的屬性,使它''transient'不會留下太多的序列:-) – rsp 2012-01-01 11:52:54

1

是否Controller實施SerializableViewController的所有字段都必須聲明它們是可序列化的。