我一直在获取java.io.NotSerializableException:java.io.ObjectOutputStream [英] I keep getting java.io.NotSerializableException: java.io.ObjectOutputStream
问题描述
这是我一直在尝试的代码
This is the code that I have been trying
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();
}
}
这是我得到的例外情况
线程 main中的异常java.io.NotSerializableException:java.io.ObjectOutputStream上的
java.io.ObjectOutputStream
。 java.io.ObjectOutputStream.defaultWriteFields的writeObject0(未知源)
(java.io.ObjectOutputStream.writeSerialData(未知源)的
java.io.ObjectOutputStream.writeOrdinaryObject(未知来源)java.io.ObjectOutputStream.writeObject0处的
(未知来源)java.io.ObjectOutputStream.writeObject处的
(储蓄处)的
。(Banking.java:22)
在Banking.main(Banking.java:30)
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)
我也尝试使用 savobj.accData .writeObj(savobj)
来自 main(
),但我仍然遇到相同的异常。我该怎么办?
I also tried using savobj.accData.writeObj(savobj)
from main(
), but I still get the same exception. What should I do?
推荐答案
仅实现可序列化
的基元和类。接口可以序列化。 ObjectOutputStream
没有实现此接口。
Only primitives and classes that implement Serializable
interface can be serialized. ObjectOutputStream
doesn't implement this interface.
快速解决方案:使用 ObjectOutputStream
在尽可能小的范围内,在使用它的方法中声明,而不是在类中声明为字段。与其他实用程序类(例如 Scanner
)类似。
Quick solution: use the ObjectOutputStream
in the narrowest possible scope, declare it in the method where it's being used, not as a field in the class. Do similar with other utility classes like 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
,因此它们不会被序列化/反序列化:
Another solution may be just marking these fields as transient
so they won't be serialized/deserialized:
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected transient ObjectOutputStream accData;
transient Scanner input = new Scanner(System.in);
}
这篇关于我一直在获取java.io.NotSerializableException:java.io.ObjectOutputStream的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!