2012-10-27 52 views
1

只做了簡短的閱讀,試圖在我的代碼中實現序列化。使用java序列化對象

基本上,我有一個Test類,持有一堆Questions。如果可能的話,我想要一次對整個Test對象進行序列化,或者如果不是每個對象Question。現在我正在嘗試做每個Question

public abstract class Question implements Serializable { 
    ... 
} 

public class Test { 

... 

public void save() { 
    try { 

     System.out.print("File name will be saved.ser: "); 

     FileOutputStream fileOut = new FileOutputStream("saved.ser"); 

     ObjectOutputStream out = new ObjectOutputStream(fileOut); 

     for (Question question : questionList) { 
      out.writeObject(question); 
     } 

     out.close(); 
     fileOut.close(); 

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

然後它給出了這樣的錯誤:

java.io.NotSerializableException: java.util.Scanner 
    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) 
    at main.Survey.save(Survey.java:129) 
    at main.MainDriver.main(MainDriver.java:59) 

是不是在Question每一個對象實現Serializable問題?這是否也需要完成?這看起來很乏味,但我會在必要時做。我的所有課程都使用Question,包括它的子類,需要給這個接口嗎?

另外,我會更好在我的主要方法序列化整個Test對象?

+0

將問題類的整個代碼 –

回答

3

Is the problem that not every object in Question implements Serializable? Does that need to be done as well?

是的,所有可串行化的類的成員都必須是可序列化的。

Do all of my classes that are used by Question, including it's subclasses, need to be given that interface?

不,如果超類是可序列化的,那麼它的所有子類也都是可序列化的,隱含的。因此,您不需要再次將子類標記爲可序列化。

就你而言,我認爲Scanner對象不需要是類成員,並且可以是讀取輸入的局部變量。如果您仍然需要Scanner對象作爲成員變量,請將其聲明爲transient,以便在序列化和反序列化過程中將其忽略。

+0

謝謝你的迴應。看起來就是這樣! – iaacp

2

java.util.Scanner不實現接口Serializable。您必須在包含Scanner實例字段的類中將該字段聲明爲臨時字段。

最好從類實例變量中省略它,並在方法的本地使用它。通過這種方式,你不必在類中標記它是暫時的.Java規範的作者特別關心哪些類可以被序列化或不可以被序列化。包裝類如Integer,Float,...和集合類ArrayList,HashMap ...實現java.io.Serializable接口。從Java規範的作者的角度來看,Scanner類並不意味着是可序列化的。由此我們可以決定使哪個類可串行化。

+0

掃描儀用於幾個不同的地方。問題中有一個,測試中有一個,Main中有一個。 Question中還包含一些對象。我需要做的只是問題中的問題嗎? – iaacp

+0

@iaacp你必須在每個Serializable類中使它瞬變。是否應該成爲會員領域是值得懷疑的。大多數情況下,這些東西都被用作局部變量。 – EJP