1

シリアル化をコードに実装しようと、簡単に読んだだけです。

基本的に、私は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また、メイン メソッドでオブジェクト全体をシリアライズしたほうがよいでしょうか。

4

2 に答える 2

3

Question のすべてのオブジェクトが Serializable を実装しているわけではないという問題はありますか? それもやる必要ある?

はい、シリアライズ可能なクラスのすべてのメンバーもシリアライズ可能である必要があります。

サブクラスを含め、Question で使用されるすべてのクラスに、そのインターフェイスを指定する必要がありますか?

いいえ、スーパークラスがシリアライズ可能である場合、そのすべてのサブクラスも暗黙的にシリアライズ可能です。したがって、サブクラスを明示的にシリアライズ可能として再度マークする必要はありません。

あなたの場合、 Scanner オブジェクトはクラスメンバーである必要はなく、入力を読み取るローカル変数にすることができると思います。Scanner オブジェクトをメンバー変数にする必要がある場合transientは、シリアル化および逆シリアル化プロセス中に無視されるように宣言します。

于 2012-10-27T06:54:40.550 に答える
2

java.util.Scanner は、 Serializableインターフェイスを実装していません。Scannerインスタンスフィールドを含むクラスで、フィールドを一時的として宣言する必要があります。

クラスのインスタンス変数から省略して、メソッド内でローカルに使用する方がよいでしょう。このようにして、クラスで一時的なものとしてマークする必要はありません。Java 仕様の作成者は、どのクラスをシリアライズ可能にするかどうかに特に注意を払っています。Integer、 Floatなどのラッパー クラスと、 ArrayList、 HashMap などのコレクション クラスは、 java.io.Serializable インターフェイスを実装します。Scanner クラスは、Java 仕様の作成者の観点からはシリアライズ可能であることを意図していません。そこから、どのクラスをシリアライズ可能にするかを決定できます。

于 2012-10-27T06:53:21.857 に答える