不可序列化Java

不可序列化Java,java,file,computer-science,serializable,Java,File,Computer Science,Serializable,我不明白为什么我的类不能序列化。正如您在下面的代码中看到的,我的类实现了可序列化接口 public class Firm { PrintWriter out = new PrintWriter(System.out, true); Scanner sc = new Scanner(System.in); Set<Worker> workers = new HashSet<>(); boolean saveToFile(){ String fileName =

我不明白为什么我的类不能序列化。正如您在下面的代码中看到的,我的类实现了可序列化接口

public class Firm {

PrintWriter out = new PrintWriter(System.out, true);
Scanner sc = new Scanner(System.in);

Set<Worker> workers = new HashSet<>();

boolean saveToFile(){
    String fileName = "text.txt";
    ObjectOutputStream file;
    boolean save = false;
    try{
        file = new ObjectOutputStream(new FileOutputStream(fileName));
        file.writeObject(workers);
        file.close();
        save = true;
    }catch(IOException e){
        e.printStackTrace();
    }
    return save;
}
}

import java.io.Serializable;

public abstract class Worker implements Serializable {//Code
公共类公司{
PrintWriter out=新的PrintWriter(System.out,true);
扫描仪sc=新的扫描仪(System.in);
Set workers=new HashSet();
布尔存储文件(){
字符串fileName=“text.txt”;
ObjectOutputStream文件;
布尔保存=假;
试一试{
file=newobjectoutputstream(newfileoutputstream(fileName));
file.writeObject(workers);
file.close();
save=true;
}捕获(IOE异常){
e、 printStackTrace();
}
返回保存;
}
}
导入java.io.Serializable;
公共抽象类工作程序实现可序列化的{//代码

有没有办法解决这个问题?

问题是
PrintWriter
Scanner
不能序列化;你不能像那样序列化I/O连接


如果需要,将它们作为局部变量移动到使用它们的任何地方。不要将它们存储在类中。

问题是,
PrintWriter
Scanner
不可序列化;不能像那样序列化I/O连接


如果需要,将它们作为局部变量移动到使用它们的任何地方。不要将它们存储在类中。

您应该确保
Worker
类中的所有字段也具有实现
可序列化接口的类型

public class Firm {

PrintWriter out = new PrintWriter(System.out, true);
Scanner sc = new Scanner(System.in);

Set<Worker> workers = new HashSet<>();

boolean saveToFile(){
    String fileName = "text.txt";
    ObjectOutputStream file;
    boolean save = false;
    try{
        file = new ObjectOutputStream(new FileOutputStream(fileName));
        file.writeObject(workers);
        file.close();
        save = true;
    }catch(IOException e){
        e.printStackTrace();
    }
    return save;
}
}

import java.io.Serializable;

public abstract class Worker implements Serializable {//Code
根据您的注释中的类名和stacktrace片段,您很可能在
Worker
类中有类型为
Firm
的字段,该字段由于其结构而不可序列化

因此,您必须至少做两件事:

1)
Firm
类还必须实现
Serializable
接口


2) 将
Scanner
字段标记为
transient

您应该确保
Worker
类中的所有字段也具有实现
可序列化接口的类型

public class Firm {

PrintWriter out = new PrintWriter(System.out, true);
Scanner sc = new Scanner(System.in);

Set<Worker> workers = new HashSet<>();

boolean saveToFile(){
    String fileName = "text.txt";
    ObjectOutputStream file;
    boolean save = false;
    try{
        file = new ObjectOutputStream(new FileOutputStream(fileName));
        file.writeObject(workers);
        file.close();
        save = true;
    }catch(IOException e){
        e.printStackTrace();
    }
    return save;
}
}

import java.io.Serializable;

public abstract class Worker implements Serializable {//Code
根据您的注释中的类名和stacktrace片段,您很可能在
Worker
类中有类型为
Firm
的字段,该字段由于其结构而不可序列化

因此,您必须至少做两件事:

1)
Firm
类还必须实现
Serializable
接口


2) 将
Scanner
字段标记为
transient

您遇到了什么样的错误?扩展和使用您的
Pracownik
类的代码部分在哪里?我不是英国人,所以我在发布代码时编辑了代码。现在是Worker class.java.io.NotSerializableException:java.util.Scanner at java.io.ObjectOutputStrejava.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)上的am.WriteObject 0(ObjectOutputStream.java:1184)等等。你应该在你的问题中发布错误信息,而不是评论。另外,我无法用你当前的代码示例重现你的问题,所以请发布正确的/@Pshemo是
20
的用户,可以编辑自己的帖子吗?是的,只需在你的问题下使用选项。堆栈溢出允许你更改你的问题(只要变化有意义)由于声誉更高的用户可以轻松地将您的更改回滚到以前的状态(例如,如果您将问题更改为全新的问题)。您遇到了什么样的错误?扩展并使用您的
Pracownik
类的代码部分在哪里?我不是英国人,所以在发布时编辑了我的代码。现在是WWorker class.java.io.NotSerializableException:java.util.Scanner位于java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)处java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)处等等。你应该在你的问题中发布错误信息,而不是评论。另外,我无法用你当前的代码示例重现你的问题,所以请发布正确的/@Pshemo是
20
的用户,可以编辑自己的帖子吗?是的,只需在你的问题下使用选项。堆栈溢出允许你更改你的问题(只要更改是有意义的)因为声誉更高的用户可以轻松地将您的更改回滚到以前的状态,例如,如果您将问题更改为全新的问题。