2013-04-23 50 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不可序列化。它需要是可序列化的,因为映射的内容需要可序列化以便整个映射可序列化。