2015-04-12 45 views
2

這是我一直在努力我不斷收到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(); 
    } 
} 

的代碼,這是例外,我得到

異常在線程「主要的「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) 在Banking.main(Banking.java:30)

我也利用main(savobj.accData.writeObj(savobj)試過),但我仍然得到同樣的例外。我該怎麼辦?

回答

4

只有實現了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); 
} 
+0

兩項建議都還不錯,特別是縮小範圍。從長遠來看,這是一個更好的方法,而不是使用'transient'。 – Makoto

+0

完美運作 – vicky96