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 接口。从 Java 规范作者的角度来看,Scanner 类并不意味着是可序列化的。从中我们可以决定要使哪个类可序列化。

于 2012-10-27T06:53:21.857 回答