2013-04-23 17 views
6

Non ho mai usato la serializzazione prima. Penso di aver tutto bene tranne l'ultima parte nel mio case-switch "Q".Serializzare una 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(); 

    } 

Questo va avanti per contenere un po 'di più codice, ma quello che penso che è veramente importante è il mio caso "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; 

Quando si tenta di salvare tutti i dati al mio obj file e chiudere i flussi e uscire il mio programma ho tutti questi errori ...

java.io.NotSerializableException: Oggetto a java.io.ObjectOutputStream.writeObject0 (fonte sconosciuta) a java.io. ObjectOutputStream.wri teObject (fonte sconosciuta) a java.util.Hashtable.writeObject (fonte sconosciuta) a sun.reflect.NativeMethodAccessorImpl.invoke0 (metodo natale) a sun.reflect.NativeMethodAccessorImpl.invoke (fonte sconosciuta) a sun.reflect. DelegatingMethodAccessorImpl.invoke (fonte sconosciuta) a java.lang.reflect.Method.invoke (fonte sconosciuta) a java.io.ObjectStreamClass.invokeWriteObject (fonte sconosciuta) a java.io.ObjectOutputStream.writeSerialData (fonte sconosciuta) a java.io.ObjectOutputStream.writeOrdinaryObject (sorgente sconosciuta) in java.io.ObjectOutputStream.writeObject0 (sorgente sconosciuta) in java.io.ObjectOutputStream.defaultWriteFields (sorgente sconosciuta) in java.io.ObjectOutputStream.writeSerialData (fonte sconosciuta) a java.io.ObjectOutputStream.writeOrdinaryObject (fonte sconosciuta) a java.io.ObjectOutputStream.writeObject0 (fonte sconosciuta) a java.io.ObjectOutputStream.writeObject (fonte sconosciuta) su Test.main (Test.java:143)

Non sono sicuro di cosa significhi la maggior parte di questi errori o perché li sto ricevendo o persino come risolverli. Qualcuno può aiutarmi?

EDIT: NEGOZIO 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; 

} 

} 

** Il mio HashTable detiene oggetti oggetto che non implementano Serializable. Che ora ho risolto. Il programma funziona e il caso Q funziona bene! Ora è il mio caso U che non funziona e qui è ...

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; 

Lo scopo di questo caso è quello di permettere all'utente di scegliere se o non vogliono usare i dati memorizzati nel mio obj file o no. Ottengo questi errori durante il tentativo di utilizzare quel caso

a java.io.ObjectInputStream $ BlockDataInputStream.peekByte (fonte sconosciuta) a java.io.ObjectInputStream.readObject0 (fonte sconosciuta) a java.io.ObjectInputStream. readObject (fonte sconosciuta) a Test.main (Test.java:142)

+3

Puoi pubblicare la classe Store? La mia ipotesi è che non è contrassegnato come serializzabile o qualcosa all'interno non è serializzabile. – hd1

+0

Gli oggetti che stai tentando di memorizzare, serializzabili? –

+0

'NotSerializableException' significa che stai tentando di serializzare qualcosa che non è serializzabile. Mostra la tua classe 'Store' ... – jlordo

risposta

10

Anche se l'oggetto è serializzabile Hashtable, gli oggetti che si archiviano all'interno deve essere serializzabile pure. Quindi prima verificherei per vedere se qualsiasi cosa tu stia memorizzando all'interno del tuo Hashtable implementa l'interfaccia Serializable. Per lo meno, la tua classe Store dovrebbe anche implementare l'interfaccia Serializable.

UPDATE

In base alla tua domanda aggiornato, sembra che la classe Item sarà necessario implementare Serializable pure. In realtà, questo è esattamente ciò che la prima linea di eccezione dice:

java.io.NotSerializableException: Item 
+0

Questo è un commento migliore di una risposta, IMO – hd1

+2

@ hd1 OP ha chiesto perché stava ottenendo questi errori ... Ho spiegato perché e come risolverlo. :) IMO è una risposta. –

+1

IMO, non è una risposta, ma dovremo accettare di non essere d'accordo – hd1

1

È possibile scrivere solo gli oggetti che sono Serializable ed è possibile cercare JavaDoc di Oracle per questo e apprendere i dettagli.

In generale, si aggiunge implements Serializable a qualsiasi classe che soddisfi alcuni requisiti, nella maggior parte dei casi.

Una classe deve avere solo i campi che sono essi stessi oggetti Serializable o alcuni dei tipi prime come int o char, ecc

Se vi sono campi che sono di alcuni super-tipo, l'istanza dell'oggetto occupante quel campo deve essere serializzabile anche se il super-tipo non lo è.

C'è molto di più.

1

"java.io.NotSerializableException: Elemento" sta dicendo che class Item non è serializzabile. Deve essere serializzabile perché il contenuto di una mappa deve essere serializzabile per rendere l'intera mappa serializzabile.