繁体   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