2013-04-23 65 views
6

我從來沒有使用過序列化。我認爲除了我的「Q」情況開關中的最後一部分之外,我已經擁有了它。序列化HashTable,Java

public class Test{ 

public static void main(String args[]){ 

    Store store = new Store(); 

    FileOutputStream fos; 
    ObjectOutputStream oos = null; 

    try{ 

     fos = new FileOutputStream(new File("table.obj")); 
     oos = new ObjectOutputStream(fos); 

    }catch(IOException e1){ 

     e1.printStackTrace(); 

    } 

這正好包含了一堆更多的代碼,但我認爲真正重要的是我的「Q」的情況下......

case "Q": 

      System.out.println("Good-Bye!"); 

      try{ 

       oos.writeObject(store); 
       oos.flush(); 
       oos.close(); 

      }catch(IOException e){ 

       e.printStackTrace(); 

      } 

      System.exit(0); 

      break; 

當我試圖將所有的數據保存到我的obj文件並關閉流和退出我的程序我得到所有這些錯誤...

java.io.NotSerializableException

:項目 在java.io.ObjectOutputStream.writeObject0(來源不明) 在java.io. ObjectOutputStream.wri teObject(來源不明) 在java.util.Hashtable.writeObject(來源不明) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(來源不明) 在sun.reflect。 DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at java.io.ObjectStreamClass.invokeWriteObject(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.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 Test.main(Test.java:143)

我不確定這些錯誤中的大部分意味着什麼,或者我爲什麼要獲取它們,甚至是如何解決它們。誰能幫我?

編輯:STORE CLASS

import java.io.Serializable; 
import java.util.Hashtable; 

public class Store implements Serializable{ 

Hashtable<String, Item> stockedItems = new Hashtable<String, Item>(); 

public boolean addItem(String code){ 

    if(stockedItems.containsKey(code)){ 

     stockedItems.get(code).incrementQuantity(); 

     return true; 

    } 

    return false; 

} 

public boolean removeItem(String code){ 

    if(stockedItems.containsKey(code)){ 

     stockedItems.get(code).decrementQuantity(); 

     return true; 

    } 

    return false; 


} 

public boolean findItem(String code){ 

    if(stockedItems.containsKey(code)){ 

     return true; 

    } 

    return false; 

} 

} 

**我的HashTable持有不實現Serializable項目對象。我現在修好了。程序運行和Q case工作正常!現在,它是我的U箱不工作,這裏是......

case "U": 

      try{ 

       FileInputStream fis = new FileInputStream("table.obj"); 
       ObjectInputStream ois = new ObjectInputStream(fis); 

       store = (Store)ois.readObject(); 

       ois.close(); 

      }catch(IOException | ClassNotFoundException e){ 

       e.printStackTrace(); 

      } 

      break; 

這種情況下的目的是爲了讓用戶選擇他們是否希望使用存儲在我的obj數據文件與否。我在嘗試使用這種情況下

在java.io.ObjectInputStream中的$ BlockDataInputStream.peekByte(來源不明) 在java.io.ObjectInputStream.readObject0(來源不明) 在java.io.ObjectInputStream中得到這些錯誤。的readObject(來源不明) 在Test.main(Test.java:142)

+3

你可以發佈Store類嗎?我的猜測是它沒有被標記爲可序列化或者其中的某些內容是不可序列化的。 – hd1 2013-04-23 18:14:41

+0

您試圖存儲,可序列化的對象? – 2013-04-23 18:14:53

+0

'NotSerializableException'意味着你正試圖序列化不可序列化的東西。顯示你的Store類# – jlordo 2013-04-23 18:15:46

回答

10

即使Hashtable對象序列化,你是存儲的對象必須是可序列化也是如此。所以我會先檢查一下,看看你在Hashtable裏面儲存的東西是否實現了Serializable接口。至少,你的Store類也應該實現Serializable接口。

UPDATE

基於更新後的問題,它看起來像Item類需要實現Serializable爲好。事實上,這正是異常的第一行說:

java.io.NotSerializableException: Item 
+0

這是更好的意思,作爲評論比答案,IMO – hd1 2013-04-23 18:16:13

+2

@ hd1 OP問他爲什麼得到這些錯誤......我解釋了爲什麼以及如何解決它。 :) IMO是一個答案。 – 2013-04-23 18:16:50

+1

國際海事組織,這不是一個答案,但我們必須同意不同意 – hd1 2013-04-23 18:17:37

1

你只能寫那些Serializable對象和你可以看一下Oracle的Java文檔是學習的細節。

通常,在大多數情況下,您可以將implements Serializable添加到滿足幾個要求的任何類。

一個類必須僅具有要麼是本身可序列化對象或某些原始類型,如intchar的字段等

如果有一些超類型的字段,該對象實例佔用該字段必須是可串行化的,即使超類型不是。

還有很多。

1

「java.io.NotSerializableException:Item」說class Item不可序列化。它需要是可序列化的,因爲映射的內容需要可序列化以便整個映射可序列化。