我不断收到 java.io.NotSerializableException:java.io.ObjectOutputStream
I keep getting java.io.NotSerializableException: java.io.ObjectOutputStream
这是我一直在尝试的代码
import java.util.Scanner;
import java.io.*;
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected ObjectOutputStream accData;
Scanner input = new Scanner(System.in);
}
class Savings extends Account implements Serializable {
Savings() throws IOException {
System.out.print("enter your name: ");
accountHolderName = input.nextLine();
System.out.print("\n");
System.out.print("enter your balance: ");
balance = input.nextLong();
accData = new ObjectOutputStream(new FileOutputStream(accountHolderName + ".bin"));
accData.writeObject(this);
accData.close();
}
}
class Banking implements Serializable {
public static void main(String args[]) throws IOException {
Scanner input = new Scanner(System.in);
Savings savobj = new Savings();
}
}
这是我得到的例外情况
Exception in thread "main" java.io.NotSerializableException:
java.io.ObjectOutputStream
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 Savings.(Banking.java:22)
at Banking.main(Banking.java:30)
我也尝试使用 main(
中的 savobj.accData.writeObj(savobj)
),但我仍然遇到相同的异常。我该怎么办?
只能序列化实现 Serializable
接口的原语和 classes。 ObjectOutputStream
没有实现这个接口。
快速解决方案:在尽可能窄的范围内使用 ObjectOutputStream
,在使用它的方法中声明它,而不是作为 class 中的字段。与其他实用程序 classes 类似 Scanner
.
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
//protected ObjectOutputStream accData;
//Scanner input = new Scanner(System.in);
}
class Savings extends Account implements Serializable {
Savings() throws IOException {
Scanner input = new Scanner(System.in);
System.out.print("enter your name: ");
accountHolderName = input.nextLine();
System.out.print("\n");
System.out.print("enter your balance: ");
balance = input.nextLong();
ObjectOutputStream accData = new ObjectOutputStream(new FileOutputStream(accountHolderName + ".bin"));
accData.writeObject(this);
accData.close();
}
}
另一种解决方案可能只是将这些字段标记为 transient
,这样它们就不会是 serialized/deserialized:
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected transient ObjectOutputStream accData;
transient Scanner input = new Scanner(System.in);
}
这是我一直在尝试的代码
import java.util.Scanner;
import java.io.*;
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected ObjectOutputStream accData;
Scanner input = new Scanner(System.in);
}
class Savings extends Account implements Serializable {
Savings() throws IOException {
System.out.print("enter your name: ");
accountHolderName = input.nextLine();
System.out.print("\n");
System.out.print("enter your balance: ");
balance = input.nextLong();
accData = new ObjectOutputStream(new FileOutputStream(accountHolderName + ".bin"));
accData.writeObject(this);
accData.close();
}
}
class Banking implements Serializable {
public static void main(String args[]) throws IOException {
Scanner input = new Scanner(System.in);
Savings savobj = new Savings();
}
}
这是我得到的例外情况
Exception in thread "main" java.io.NotSerializableException: java.io.ObjectOutputStream 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 Savings.(Banking.java:22) at Banking.main(Banking.java:30)
我也尝试使用 main(
中的 savobj.accData.writeObj(savobj)
),但我仍然遇到相同的异常。我该怎么办?
只能序列化实现 Serializable
接口的原语和 classes。 ObjectOutputStream
没有实现这个接口。
快速解决方案:在尽可能窄的范围内使用 ObjectOutputStream
,在使用它的方法中声明它,而不是作为 class 中的字段。与其他实用程序 classes 类似 Scanner
.
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
//protected ObjectOutputStream accData;
//Scanner input = new Scanner(System.in);
}
class Savings extends Account implements Serializable {
Savings() throws IOException {
Scanner input = new Scanner(System.in);
System.out.print("enter your name: ");
accountHolderName = input.nextLine();
System.out.print("\n");
System.out.print("enter your balance: ");
balance = input.nextLong();
ObjectOutputStream accData = new ObjectOutputStream(new FileOutputStream(accountHolderName + ".bin"));
accData.writeObject(this);
accData.close();
}
}
另一种解决方案可能只是将这些字段标记为 transient
,这样它们就不会是 serialized/deserialized:
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected transient ObjectOutputStream accData;
transient Scanner input = new Scanner(System.in);
}