Jee*_*ekh 3 java exception serializable
这是我一直在尝试的代码
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的例外
线程“主”中的异常java.io.NotSerializableException:java.io.ObjectOutputStream.writeObject0(未知源)处的java.io.ObjectOutputStream(java.io.ObjectOutputStream.writeSerialData(java.io.ObjectOutputStream.defaultWriteFields(未知源)) java.io.ObjectOutputStream.writeOrdinaryObject处的未知源(Object.java.io.ObjectOutputStream.writeObject0处的未知源)java.io.ObjectOutputStream.writeObject处的Savings。(Banking.java:22)处的未知源) Banking.main(Banking.java:30)
我也尝试使用savobj.accData.writeObj(savobj)from main(),但仍然遇到相同的异常。我该怎么办?
只有实现Serializable接口的原语和类才能被序列化。ObjectOutputStream没有实现此接口。
快速解决方案:ObjectOutputStream在尽可能小的范围内使用,在使用它的方法中声明它,而不是在类中声明它。对其他实用程序类(例如)执行类似操作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();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个解决方案可能只是将这些字段标记为,transient这样它们就不会被序列化/反序列化:
abstract class Account implements Serializable {
protected String accountHolderName;
protected long balance;
protected transient ObjectOutputStream accData;
transient Scanner input = new Scanner(System.in);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19905 次 |
| 最近记录: |