2013-04-23 8 views
6

Я никогда не использовал сериализацию раньше. Я думаю, что у меня все в порядке, кроме последней части моего «Q» case-switch.Сериализация 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 (Unknown Source) в java.io. ObjectOutputStream.wri teObject (Unknown Source) в java.util.Hashtable.writeObject (Unknown Source) в sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) в sun.reflect.NativeMethodAccessorImpl.invoke (Unknown Source) в sun.reflect. DelegatingMethodAccessorImpl.invoke (Unknown Source) в java.lang.reflect.Method.invoke (Unknown Source) в java.io.ObjectStreamClass.invokeWriteObject (Unknown Source) в java.io.ObjectOutputStream.writeSerialData (Unknown Source) в java.io.ObjectOutputStream.writeOrdinaryObject (Неизвестный источник) at java.io.ObjectOutputStream.writeObject0 (Неизвестный источник) at java.io.ObjectOutputStream.defaultWriteFields (Неизвестный источник) at java.io.ObjectOutputStream.writeSerialData (Unknown Source) в java.io.ObjectOutputStream.writeOrdinaryObject (Unknown Source) в java.io.ObjectOutputStream.writeObject0 (Unknown Source) в java.io.ObjectOutputStream.writeObject (Unknown Source) at Test.main (Test.java:143)

Я не уверен, что означает большинство этих ошибок или почему я их получаю или даже как их исправить. Может кто-нибудь мне помочь?

EDIT: STORE КЛАСС

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 отлично! Теперь это мой случай 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 (Unknown Source) в java.io.ObjectInputStream.readObject0 (Unknown Source) в java.io.ObjectInputStream. readObject (Unknown Source) на Test.main (Test.java:142)

+3

Можете ли вы опубликовать класс Store? Я предполагаю, что он не помечен как сериализуемый или что-то внутри не сериализуется. – hd1

+0

Являются ли объекты, которые вы пытаетесь сохранить, сериализуемыми? –

+0

'NotSerializableException' означает, что вы пытаетесь сериализовать то, что не является сериализуемым. Покажите свой класс 'Store' ... – jlordo

ответ

10

Даже если Hashtable объект сериализации, объекты, которые вы храните внутри должно быть сериализации, а также. Поэтому я сначала проверил бы, будет ли то, что вы храните внутри своего Hashtable, реализует интерфейс Serializable. По крайней мере, ваш класс Store также должен реализовать интерфейс Serializable.

UPDATE

на основе обновленной вопрос, это выглядит как Item класс должен будет реализовать Serializable, а также. На самом деле, это именно то, что первая строка за исключением говорит:

java.io.NotSerializableException: Item 
+0

Это лучше понимать как комментарий, чем ответ, IMO – hd1

+2

@ hd1 OP спросил, почему он получил эти ошибки ... Я объяснил, почему и как это исправить. :) ИМО - это ответ. –

+1

IMO, это не ответ, но мы должны будем согласиться не согласиться – hd1

1

Вы можете писать только объекты, которые Serializable и вы можете посмотреть JavaDoc Oracle, для этого и узнать подробности.

В целом, вы добавляете implements Serializable в любой класс, который в большинстве случаев удовлетворяет нескольким требованиям.

класс должен иметь только те поля, которые либо сами Сериализуемые объекты или некоторые из исходных типов, таких как int или char и т.д.

Если есть поля, которые имеют какой-то супер-типа, экземпляр объекта занимающий это поле должно быть Сериализуемым, даже если супертип не является.

Есть еще много деталей.

1

"java.io.NotSerializableException: Item" говорит, что class Item не является сериализуемым. Он должен быть сериализуемым, потому что содержимое карты должно быть сериализуемым, чтобы вся карта была сериализована.