【问题标题】:I keep getting java.io.NotSerializableException: java.io.ObjectOutputStream我不断收到 java.io.NotSerializableException: java.io.ObjectOutputStream
【发布时间】:2015-06-18 00:02:55
【问题描述】:

这是我一直在尝试的代码

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();
    }
}

这是我得到的例外

线程“主”java.io.NotSerializableException 中的异常: java.io.ObjectOutputStream 在 java.io.ObjectOutputStream.writeObject0(未知来源) 在 java.io.ObjectOutputStream.defaultWriteFields(未知来源) 在 java.io.ObjectOutputStream.writeSerialData(未知来源) 在 java.io.ObjectOutputStream.writeOrdinaryObject(未知来源) 在 java.io.ObjectOutputStream.writeObject0(未知来源) 在 java.io.ObjectOutputStream.writeObject(未知来源) 在储蓄。(Banking.java:22) 在 Banking.main(Banking.java:30)

我也尝试使用来自main(savobj.accData.writeObj(savobj)),但我仍然遇到同样的异常。我该怎么办?

【问题讨论】:

    标签: java exception serializable


    【解决方案1】:

    只有实现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();
        }
    }
    

    另一种解决方案可能只是将这些字段标记为transient,这样它们就不会被序列化/反序列化:

    abstract class Account implements Serializable {
        protected String accountHolderName;
        protected long balance;
    
        protected transient ObjectOutputStream accData;
    
         transient Scanner input = new Scanner(System.in);
    }
    

    【讨论】:

    • 这两个建议都不错,尤其是缩小范围。从长远来看,这将是一种比使用transient 更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2019-11-24
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多