2013-04-23 10 views
6

Nigdy wcześniej nie używałam Serializacji. Myślę, że wszystko jest w porządku, z wyjątkiem ostatniej części w moim przełączniku przypadków "Q".Serializing a 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(); 

    } 

Trwa to zawiera kilka więcej kodu, ale co uważam za bardzo ważne jest mój „Q” przypadek ...

case "Q": 

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

      try{ 

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

      }catch(IOException e){ 

       e.printStackTrace(); 

      } 

      System.exit(0); 

      break; 

Gdy próbuję zapisać wszystkich danych do mojego Obj plik i zamknąć strumienie i opuścić mój program mam wszystkie te błędy ...

java.io.NotSerializableException: Pozycja na java.io.ObjectOutputStream.writeObject0 (Unknown Source) na java.io. ObjectOutputStream.wri teObject (Unknown Source) na java.util.Hashtable.writeObject (Unknown Source) w sun.reflect.NativeMethodAccessorImpl.invoke0 (metoda podstawowa) w sun.reflect.NativeMethodAccessorImpl.invoke (Unknown Source) w sun.reflect. DelegatingMethodAccessorImpl.invoke (Unknown Source) na java.lang.reflect.Method.invoke (Unknown Source) w java.io.ObjectStreamClass.invokeWriteObject (Unknown Source) w java.io.ObjectOutputStream.writeSerialData (Unknown Source) na java.io.ObjectOutputStream.writeOrdinaryObject (Nieznane źródło) w java.io.ObjectOutputStream.writeObject0 (Nieznane źródło) w java.io.ObjectOutputStream.defaultWriteFields (Unknown Source) at java.io.ObjectOutputStream.writeSerialData (Unknown Source) na java.io.ObjectOutputStream.writeOrdinaryObject (Unknown Source) na java.io.ObjectOutputStream.writeObject0 (Unknown Source) na java.io.ObjectOutputStream.writeObject (Unknown Source) w Test.main (Test.java:143)

Nie jestem pewien, co oznacza większość tych błędów i dlaczego je otrzymuję, a nawet jak je naprawić. Czy ktoś może mi pomóc?

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

} 

} 

** Mam HashTable posiada pozycji obiektów, które nie implementują Serializable. Które teraz naprawiłem. Przebieg programu i przypadek Q działa dobrze! Teraz to jest moja sprawa U, które nie działa, a tutaj jest ...

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; 

Celem tym przypadku jest umożliwienie użytkownikowi wybrać, czy chcą korzystać z danych przechowywanych w moim .obj plik lub nie. Otrzymuję te błędy przy próbie użycia takim przypadku

na java.io.ObjectInputStream $ BlockDataInputStream.peekByte (Unknown Source) na java.io.ObjectInputStream.readObject0 (Unknown Source) na java.io.ObjectInputStream. readObject (Unknown Source) na Test.main (Test.java:142)

+3

Czy możesz opublikować klasę Sklep? Domyślam się, że nie jest oznaczony jako możliwy do serializacji lub coś wewnątrz nie jest możliwe do serializacji. – hd1

+0

Czy obiekty, które próbujesz zapisać, można poddać serializacji? –

+0

'NotSerializableException' oznacza, że ​​próbujesz serializować coś, czego nie można serializować. Pokaż swoją klasę 'Store' ... – jlordo

Odpowiedz

10

Nawet jeśli obiekt jest możliwy do serializacji Hashtable, przedmioty, które są przechowywane wewnątrz musi być możliwy do serializacji, jak również. Najpierw sprawdzam, czy to, co przechowujesz w swoim urządzeniu Hashtable, implementuje interfejs Serializable. Przynajmniej Twoja klasa Store powinna również implementować interfejs Serializable.

UPDATE

podstawie zaktualizowanego pytanie, wygląda klasa Item będą musiały wdrożyć Serializable również. W rzeczywistości, to jest dokładnie to, co pierwsza linia wyjątkiem mówi:

java.io.NotSerializableException: Item 
+0

To jest lepsze jako komentarz niż odpowiedź, IMO – hd1

+2

@ hd1 OP zapytał, dlaczego dostał te błędy ... Wyjaśniłem, dlaczego i jak to naprawić. :) IMO to odpowiedź. –

+1

IMO, to nie jest odpowiedź, ale musimy się zgodzić, aby się nie zgodzić – hd1

1

Można pisać tylko obiekty, które są Serializable i można patrzeć javadoc Oracle za to i dowiedzieć się szczegółów.

Ogólnie, do każdej klasy, która spełnia kilka wymagań, dodaje się implements Serializable.

Klasa ma mieć tylko pola, które albo same serializacji obiektów lub niektórych rodzajów surowców, takich jak int lub char itd

Jeśli istnieją obszary, które są pewnego rodzaju super, instancja obiektu zajmując to pole musi być nadające się do szeregowania, nawet jeśli supertyp nie jest.

Jest o wiele więcej.

1

"java.io.NotSerializableException: Item" mówi, że class Item nie można szeregować. Musi być możliwy do serializacji, ponieważ zawartość mapy musi być możliwa do serializacji, aby cała mapa mogła być serializowana.