在java中序列化对象

在java中序列化对象,java,serialization,Java,Serialization,只是做了一个简短的阅读,试图在我的代码中实现序列化 基本上,我有一个测试类,里面有一堆问题。如果可能的话,我想立即序列化整个测试对象,或者如果不是每个问题。现在我正试着回答每个问题 public abstract class Question implements Serializable { ... } public class Test { ... public void save() { try { System.out.print("File na

只是做了一个简短的阅读,试图在我的代码中实现序列化

基本上,我有一个
测试
类,里面有一堆
问题
。如果可能的话,我想立即序列化整个
测试
对象,或者如果不是每个
问题
。现在我正试着回答每个
问题

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
使用的所有类(包括其子类)都需要提供该接口吗


另外,在我的main方法中序列化整个
Test
对象会更好吗?

java.util.Scanner没有实现接口。您必须在包含实例字段的类中将该字段声明为transient


最好从类实例变量中省略它,并在方法中局部使用它。通过这种方式,您不必在类中标记它为transient。Java规范的作者对于哪些类是可串行化的或不可串行化的非常详细。包装类,如,Float,。。。和集合类,如HashMap。。。实现java.io.Serializable接口。从java规范作者的角度来看,Scanner类并不意味着是可序列化的。从中我们可以决定哪个类可以序列化

java.util.Scanner未实现该接口。您必须在包含实例字段的类中将该字段声明为transient

最好从类实例变量中省略它,并在方法中局部使用它。通过这种方式,您不必在类中标记它为transient。Java规范的作者对于哪些类是可串行化的或不可串行化的非常详细。包装类,如,Float,。。。和集合类,如HashMap。。。实现java.io.Serializable接口。从java规范作者的角度来看,Scanner类并不意味着是可序列化的。从中我们可以决定哪个类可以序列化

不是每个对象都实现可序列化的问题吗?是否也需要这样做

是的,可序列化类的所有成员也必须可序列化

我所有被质疑的类,包括它的子类,都需要被赋予这个接口吗

不,如果超类是可序列化的,那么它的所有子类也是可隐式序列化的。因此,不需要再次显式地将子类标记为可序列化

在您的例子中,我认为Scanner对象不需要是类成员,可以是读取输入的局部变量。如果仍然需要Scanner对象作为成员变量,请将其声明为
transient
,以便在序列化和反序列化过程中忽略它

不是每个对象都实现可序列化的问题吗?是否也需要这样做

是的,可序列化类的所有成员也必须可序列化

我所有被质疑的类,包括它的子类,都需要被赋予这个接口吗

不,如果超类是可序列化的,那么它的所有子类也是可隐式序列化的。因此,不需要再次显式地将子类标记为可序列化


在您的例子中,我认为Scanner对象不需要是类成员,可以是读取输入的局部变量。如果仍然需要Scanner对象作为成员变量,请将其声明为
transient
,以便在序列化和反序列化过程中忽略它。

将问题类的整个代码放入问题类Scanner的整个代码用于几个不同的位置。有一个在讨论中,一个在测试中,一个在主要。问题包含的对象中也有一些。我需要只对问题中的一个执行此操作吗?@iaacp您必须使其在每个可序列化类中都是瞬态的。它是否应该是一个成员字段是值得怀疑的。大多数情况下,这些东西被用作局部变量。扫描器在一些不同的地方使用。有一个在讨论中,一个在测试中,一个在主要。问题包含的对象中也有一些。我需要只对问题中的一个执行此操作吗?@iaacp您必须使其在每个可序列化类中都是瞬态的。它是否应该是一个成员字段是值得怀疑的。大多数情况下,这些都被用作局部变量。感谢您的回复。看来是他干的!谢谢你的回复。看来是他干的!