簡體   English   中英

用Java序列化對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM