[英]Serializing objects in 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
嗎? 是否也需要這樣做? 這似乎很乏味,但如有必要,我會做。 我的Question
使用的所有類(包括其子類)是否都需要該接口?
另外,在我的main方法中將整個Test
對象序列化會更好嗎?
不是問題中的每個對象都實現可序列化的問題嗎? 是否也需要這樣做?
是的,可序列化的類的所有成員也必須可序列化。
我的Question使用的所有類(包括其子類)是否都需要該接口?
不,如果超類是可序列化的,則其所有子類也都可以隱式地序列化。 因此,您無需再次將子類標記為顯式可序列化。
就您而言,我認為Scanner對象不必是類成員,而可以是您在其中讀取輸入的局部變量。 如果仍然需要Scanner對象作為成員變量,則將其聲明為transient
以便在序列化和反序列化過程中將其忽略。
java.util.Scanner沒有實現Serializable接口。 您必須在包含Scanner實例字段的類中將該字段聲明為臨時字段。
最好從類實例變量中忽略它,並在方法中本地使用它。 這樣,您就不必在類中將其標記為瞬態。Java規范的作者特別關注哪些類是可序列化的。 包裝器類(例如Integer ,Float等)和集合類(例如ArrayList ,HashMap ...)實現了java.io.Serializable接口。 從Java規范作者的角度來看,Scanner類並不意味着可序列化。 由此,我們可以決定將哪個類設置為可序列化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.