我一直在获取java.io.NotSerializableException:java.io.ObjectOutputStream [英] I keep getting java.io.NotSerializableException: java.io.ObjectOutputStream

查看:610
本文介绍了我一直在获取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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆