只是做了一个简短的阅读,尝试在我的代码中实现序列化。
基本上,我有一个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)
问题不是问题中的每个对象都实现了Serializable吗?那还需要吗?
是的,可序列化的类的所有成员也必须是可序列化的。
我对Question使用的所有类(包括它的子类)都需要给出该接口吗?
不,如果超类是可序列化的,那么它的所有子类也可以隐式地序列化。因此,您不需要再次将子类标记为可序列化。
在您的情况下,我认为Scanner对象不必是类成员,并且可以是您正在读取输入的局部变量。如果仍需要将Scanner对象作为成员变量,请将其声明为transient
,以便在序列化和反序列化过程中忽略它。
答案 1 :(得分:2)
java.util.Scanner未实现Serializable接口。您必须在包含Scanner实例字段的类中将该字段声明为瞬态。
最好从类实例变量中省略它并在方法中本地使用它。通过这种方式,您不必在类中将其标记为瞬态.Java规范的作者特别关注哪些类可以序列化或不可序列化。包含类Integer,Float,...和集合类如ArrayList,HashMap ...实现java.io.Serializable接口。从Java规范的作者的角度来看,Scanner类并不是Serializable。由此我们可以决定使哪个类可以进行Serializable。