2011-11-22 48 views
5

Tôi có một vấn đề nhỏ: Tôi muốn thử nghiệm serialization trên android (sử dụng nhật thực) và tìm thấy một ví dụ làm thế nào để làm điều đó. Tôi biết tôi cần phải thực hiện "Serializable" trong lớp tôi muốn serialize, tôi đã làm điều đó và luôn luôn nhận được một ngoại lệ java.io.NotSerializableException. Dưới đây là các mã:java.io.NotSerializableException ngay cả khi tôi thực hiện "Serializable"

public void Button(View view) throws IOException, ClassNotFoundException { 
ser test = new ser(); 
    test.x = 204; 
    test.y = 2843; 
    test.speed = 12; 
    test.direction = 1343; 
    test.a = 493; 
    test.b = 2323; 
    test.c = 29489; 
    test.d = 394; 

    byte[] arr = serialize(test); 

    ser res = (ser) deserialize(arr); 
} 


public static byte[] serialize(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutput out = new ObjectOutputStream(bos);  
     out.writeObject(o);          //This is where the Exception occurs 
     out.close();  
     // Get the bytes of the serialized object  
     byte[] buf = bos.toByteArray(); 
     return buf;  
    } catch(IOException ioe) { 
     Log.e("serializeObject", "error", ioe);   //"ioe" says java.io.NotSerializableException exception 
     return null; 
    } 

} 


public static Object deserialize(byte[] b) { 
     try {  
      ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));  
      Object object = in.readObject();  
      in.close(); 
      return object; 
     } catch(ClassNotFoundException cnfe) { 
      Log.e("deserializeObject", "class not found error", cnfe); 
      return null; 
     } catch(IOException ioe) { 
      Log.e("deserializeObject", "io error", ioe);  
      return null; 
     } 
    } 

class ser implements Serializable { 
    float x, y, speed, direction, a, b, c, d; 
} 

Tôi hy vọng bạn có thể giúp tôi, tôi không biết những gì tôi đã làm sai ...

Edit: nhập khẩu của tôi là:

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
+0

Nhìn vào các kiện hàng của Android, đó có thể là những gì bạn thực sự muốn sử dụng. – blindstuff

+0

như đã trả lời/nhận xét dưới đây, gọi 'Button (null)' đang hoạt động như mong đợi: không có Ngoại lệ và nhận giá trị đúng trong 'res'. Phải là môi trường ... –

+0

Bạn thử nghiệm điều này như thế nào? Bạn có sử dụng bộ mô phỏng, bạn có triển khai thiết bị thực tế không? Bạn đang sử dụng phiên bản trình mô phỏng/Android nào? Có sự khác biệt giữa các hóa thân Android khác nhau (như Cyanogen vs Stock Android vv). –

Trả lời

6

Điều duy nhất Tôi có thể nghĩ là các lớp bạn đang chạy không phải là lớp bạn đã viết - ví dụ bạn chưa biên soạn phiên bản mới hơn.

Tôi không thể tạo lại sự cố bằng chương trình java đơn giản.

Ban đầu tôi nghĩ bạn có thể đã triển khai sunw.io.Serializable thay vì java.io.Serializable, nhưng nó mở rộng lớp io, vì vậy nó sẽ hoạt động ngay cả với nó.

+0

+1 đó là một điểm tốt, có nhiều hơn một giao diện Serializable. –

+0

nó xuất hiện sunw.io.Serializable mở rộng java.io.Serializable, vì vậy tôi đang chỉnh sửa điểm – Bozho

+0

nó hoạt động (và với một trong các Serializables). –

7

Vâng, đối tượng có thể tuần tự hóa của bạn có bất kỳ sự sắp xếp lại nào đối với các đối tượng không thể tuần tự hóa khác không? Nếu vậy, java.io.NotSerializableException sẽ bị ném vì lý do đó. Để có thể tuần tự hóa, bạn phải có lớp học đầy đủ Serializable VÀ tất cả các phụ thuộc của nó có loại Serializable (ví dụ: triển khai Serializable).

Thông điệp ngoại lệ nên cho bạn biết nếu một phụ thuộc phi serializable như vậy tồn tại:

Nó nên nói điều gì đó như "java.io.NotSerializableException: NonSerializableClassName"

Cập nhật: theo bình luận của Bozho, tôi đã không 't nhận thấy rằng trong thực tế, lớp học của bạn không có bất kỳ phụ thuộc không serializable.

+0

anh ấy chỉ nổi ở đó – Bozho

+0

Đúng, xấu của tôi, tôi đã không di chuyển tất cả các cách để phía dưới, không thấy rằng lớp "ser" là ở đó là tốt. Tôi sẽ cập nhật câu trả lời của tôi để phản ánh điều này. –

+0

Hoặc có cách nào khác để sắp xếp một lớp học không? Tất cả những gì tôi muốn làm là gửi một lớp như thế này bằng bluetooth và nó chỉ cho phép các mảng byte ... – user1059863

2

Từ mã của bạn không rõ ràng. Nhưng nếu bạn đã định nghĩa "ser" như là một lớp bên trong của một số lớp không serilizable khác (trong trường hợp của bạn có lẽ nó là "Activity" mà không phải serilizable) thì hoặc xác định rằng lớp cha cũng như serializable hoặc không xác định "ser" như lớp bên trong.

Serialization of inner classes (i.e., nested classes that are not static member classes), including local and anonymous classes, is strongly discouraged for several reasons.

3

Tôi có câu trả lời từ liên kết bên dưới, mặc dù tôi không thể hiểu toàn bộ điều. why does this simple serializable object throw NotSerializableException? Làm cho lớp bên trong của bạn không tĩnh, do đó, để tồn tại dưới dạng thứ tự tuần tự, nó sẽ cần trường hợp của lớp outter và hoạt động không được nối tiếp. Làm cho Tester trở thành một lớp riêng biệt hoặc biến nó trở thành lớp bên trong tĩnh.

0

Câu hỏi cũ, nhưng sẽ thêm giải pháp của tôi vì gần đây tôi đã gặp sự cố tương tự.

Giải pháp, đảm bảo lớp học của bạn ser không phải là lớp lồng nhau. Việc xây dựng trong tuần tự hóa Java sẽ thất bại mà không có lỗi nếu lớp của bạn được lồng trong một lớp cha mẹ không được thực hiện tuần tự.

Vì vậy, hãy di chuyển việc triển khai lớp ser thành tệp riêng của nó ser.java và việc tuần tự hóa giờ đây sẽ hoạt động.

0

Tôi đã phá vỡ đầu của tôi với điều này. Phát hành mã của tôi là tôi đã không xóa tệp .ser của mình trước khi tôi viết đối tượng mới. Mục đích của tôi là viết (serialize) ArrayList của các địa điểm và deserialize chúng. Điều này tôi làm khi tôi nhận được vị trí mới. Vì tôi không thể chắp thêm các đối tượng mà tôi đã chọn để viết Danh sách hoàn chỉnh nên tôi phải xóa tệp .ser mọi lúc trước khi tôi viết Danh sách mới. Lỗi nó hiển thị không trỏ đến vấn đề thực tế. Làm sạch và sạch sẽ trước khi bạn viết một cái gì đó cho nó.

0

Tôi biết tôi hơi muộn nhưng tôi nhận thấy bạn không có serialVersionUID, giống như private static final long serialVersionUID = 7536482295622776147L; ở đầu lớp học của bạn, cũng (mặc dù nó không quan trọng, nhưng có thể giúp bạn) thử tách biến của bạn , vì vậy:

class ser implements Serializable { 
    private static final long serialVersionUID = 7536482295622776147L; 
    float x; 
    float y; 
    float speed; 
    float direction; 
    float a; 
    float b; 
    float c; 
    float d; 
} 

một lần nữa, tôi là một chút trễ, nhưng câu hỏi này có hàng ngàn điểm, và bạn đã không chọn một câu trả lời, như vậy có lẽ điều này sẽ giúp một ai đó.

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