2012-02-17 34 views
30

Vì vậy, tôi biết nó được khuyến khích sử dụng Parcelable thay vì Serializable trong android, bởi vì nó là nhanh hơn.Android Parcelable và Serializable

Câu hỏi của tôi là: không thể tránh sử dụng Serializable phải không?

Nếu tôi có một đối tượng tùy chỉnh tôi muốn serialize, chúng ta hãy nói rằng tôi có định nghĩa lớp sau

public class Person { 
    String name; 
    int Age; 
    ... 
    .... 
} 

Làm parcelable này rất dễ dàng, bởi vì lớp người chứa các loại parcel.write *() hỗ trợ , tức là có parcel.writeString và parcel.writeInt

Bây giờ, những gì nếu lớp Person như sau:

public class PersonTwo { 
    MyCustomObj customObj; 
    String name; 
    int Age; 
    ... 
    .... 
} 

Làm sao tôi giả sử mệnh cel đối tượng MyCustomObj ?? Có vẻ như tôi cần sử dụng serializable lần nữa? nhưng một lần nữa, tôi nghĩ rằng nó là SLOW để sử dụng serializable, và có vẻ như chúng tôi không có sự lựa chọn, nhưng để sử dụng nó trong trường hợp này.

Tôi không hiểu

ai đó có thể cho tôi biết cách tôi chuyển bưu kiện PersonTwo trong trường hợp này?

+2

Tôi khuyên bạn nên sử dụng Serializable. Theo các bài kiểm tra trên Nexus 5, nó nhanh hơn nhiều so với Parcelable. Xem https://bitbucket.org/afrishman/androidserializationtest. Điều chính cần nhớ là Serializable chỉ chậm với các thiết lập mặc định. Nếu bạn sử dụng serialization thủ công, nó sẽ nhanh hơn rất nhiều. Kiểm tra liên kết ở trên để biết chi tiết. – nucleo

Trả lời

2

Bạn cần phải đặt MyCustomObj có thể chuyển nhượng.

16

Liên kết được đưa ra bởi Ajay chính xác là những gì bạn đang tìm kiếm, cách bạn có thể thực hiện. Vâng, những gì bạn có thể làm là thực hiện Parcelable-CustomObject1 của bạn và tạo ra một lớp Parcelable cho nó và sau đó bạn có thể sử dụng lớp Parcelable-Parcel nó bên trong một lớp Parcelable rằng sẽ Parcel cả CustomObjects.

public class CustomObject1 implements Parcelable { 

    // parcelable code CustomObject1 
} 

public class CustomObject2 implements Parcelable { 

    private CustomObject1 obj1; 

    // add CustomObject1 here with getter setter 
    // parcelable code for CustomObject2 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(obj1, flags); 
    } 
    private void readFromParcel(Parcel in) { 
     obj1 = in.readParcelable(CustomObject1.class.getClassLoader()); 
    } 
    ............ 
} 
+2

Cảm ơn dude, tôi đã chấp nhận cả bạn và ajay như câu trả lời, nhưng có vẻ như tôi chỉ có thể chọn một. dù sao thì cũng cám ơn bạn!! – user1118019

+1

Vâng đây là điểm trên và làm thế nào tôi làm điều đó. Chỉ cần thực hiện mọi đối tượng cần thiết, có thể chuyển đổi được vì ở cuối tất cả, đối tượng gốc sẽ chứa nguyên thủy hoặc các loại String – jonney

-1

Tôi đã xác định nơi mà sự kiện là vấn đề đối với tôi. Trên Android 4.3, tôi nhận được ngoại lệ unmarhalling, khi truyền dữ liệu giữa Các hoạt động như Khớp. Nó hoạt động tốt trên Android 4.0, 4.2 hoặc 4.4. Nó sẽ hoạt động khi được thay đổi thành Serializable, mặc dù nó chậm hơn.

+0

tốt, đó là những gì tôi trải nghiệm và thấy trong logcat ... – MartinC

+2

Vui lòng thêm một số mã để bạn cũng có thể kiểm tra nếu vấn đề nằm trong chính Android. – silverado

0

Tất cả các đối tượng hỗn hợp cũng phải được Khớp nối. Trong trường hợp, bạn muốn bỏ qua một đối tượng, sau đó không sử dụng phương thức writeToParcel.

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