2013-04-23 32 views
6

Tôi chưa bao giờ sử dụng Serialization trước đó. Tôi nghĩ rằng tôi có tất cả các quyền trừ phần cuối cùng trong trường hợp "Q" của tôi.Nối tiếp một 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(); 

    } 

này tiếp tục chứa một loạt các mã khác nhưng những gì tôi nghĩ là thực sự quan trọng là "Q" của tôi trường hợp ...

case "Q": 

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

      try{ 

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

      }catch(IOException e){ 

       e.printStackTrace(); 

      } 

      System.exit(0); 

      break; 

Khi tôi cố gắng để lưu tất cả các dữ liệu của tôi obj file và đóng suối và thoát khỏi chương trình của tôi, tôi nhận được tất cả các lỗi này ...

java.io.NotSerializableException: Item tại java.io.ObjectOutputStream.writeObject0 (Unknown Source) tại java.io. ObjectOutputStream.wri teObject (Nguồn không rõ) tại java.util.Hashtable.writeObject (Nguồn không xác định) tại sun.reflect.NativeMethodAccessorImpl.invoke0 (Phương pháp gốc) tại sun.reflect.NativeMethodAccessorImpl.invoke (Nguồn không xác định) lúc sun.reflect. DelegatingMethodAccessorImpl.invoke (Unknown Source) tại java.lang.reflect.Method.invoke (Unknown Source) tại java.io.ObjectStreamClass.invokeWriteObject (Unknown Source) tại java.io.ObjectOutputStream.writeSerialData (Unknown Source) tại java.io.ObjectOutputStream.writeOrdinaryObject (Nguồn không xác định) tại java.io.ObjectOutputStream.writeObject0 (Nguồn không xác định) tại java.io.ObjectOutputStream.defaultWriteFields (Nguồn không xác định) tại java.io.ObjectOutputStream.writeSerialData (Nguồn không xác định) tại java.io.ObjectOutputStream.writeOrdinaryObject (Nguồn không xác định) tại java.io.ObjectOutputStream.writeObject0 (Unknown Source) tại java.io.ObjectOutputStream.writeObject (Unknown Source) tại Test.main (Test.java:143)

Tôi không chắc chắn hầu hết các lỗi này có nghĩa là gì hoặc tại sao tôi nhận được chúng hoặc thậm chí cách khắc phục chúng. Ai giúp tôi với?

EDIT: CỬA HÀNG 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 My nắm giữ các đối tượng mục mà không thực hiện Serializable. Mà bây giờ tôi đã sửa. Chương trình chạy và trường hợp Q hoạt động tốt! Bây giờ nó là U trường hợp của tôi mà không làm việc và ở đây nó là ...

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; 

Mục đích của trường hợp này là cho phép người dùng chọn hay không mà họ muốn sử dụng các dữ liệu lưu trữ trong .obj của tôi tập tin hay không. Tôi nhận được các lỗi khi cố gắng sử dụng trường hợp đó

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

+3

Bạn có thể đăng lớp Store không? Tôi đoán là nó không được đánh dấu là serializable hoặc một cái gì đó bên trong không phải là serializable. – hd1

+0

Các đối tượng mà bạn đang cố gắng lưu trữ, có thể tuần tự hóa? –

+0

'NotSerializableException' có nghĩa là bạn đang cố gắng serialize một cái gì đó mà không phải là serializable. Hiển thị lớp 'Store' của bạn ... – jlordo

Trả lời

10

Thậm chí nếu đối tượng Hashtable là serializable, các đối tượng mà bạn đang lưu trữ bên nó phải là serializable là tốt. Vì vậy, trước tiên tôi sẽ kiểm tra xem bạn có đang lưu trữ bất cứ thứ gì bên trong Hashtable thực hiện giao diện Serializable hay không. Ít nhất, lớp học Store của bạn cũng nên triển khai giao diện Serializable.

CẬP NHẬT

Dựa trên câu hỏi của bạn được cập nhật, nó trông giống như lớp Item sẽ cần phải thực hiện Serializable là tốt. Trong thực tế, đây là chính xác những gì dòng đầu tiên của các ngoại lệ nói:

java.io.NotSerializableException: Item 
+0

Điều này là tốt hơn có nghĩa là một bình luận hơn là một câu trả lời, IMO – hd1

+2

@ hd1 OP hỏi lý do tại sao ông đã nhận được những lỗi này ... Tôi giải thích lý do tại sao và làm thế nào để sửa chữa nó. :) IMO đó là một câu trả lời. –

+1

IMO, đó không phải là câu trả lời, nhưng chúng tôi sẽ phải đồng ý không đồng ý – hd1

1

Bạn chỉ có thể viết các đối tượng là Serializable và bạn có thể tra cứu javadoc của Oracle cho điều đó và tìm hiểu chi tiết.

Nói chung, bạn thêm implements Serializable vào bất kỳ lớp nào đáp ứng một số yêu cầu, trong hầu hết các trường hợp.

Một lớp học có chỉ có lĩnh vực mà hoặc là bản thân đối tượng Serializable hoặc một số các loại nguyên liệu như int hay char vv

Nếu có lĩnh vực mà là của một số loại siêu, các trường hợp đối tượng chiếm trường đó phải được Serializable mặc dù siêu loại không phải là.

Còn rất nhiều thứ nữa.

1

"java.io.NotSerializableException: Mục" đang nói rằng class Item không thể tuần tự hóa được. Nó cần phải được serializable bởi vì các nội dung của một bản đồ cần phải được serializable cho toàn bộ bản đồ để được serializable.

Các vấn đề liên quan