Tìm hiểu về Serializable và Parcelable

I, Serializable

  • Quá trình serialization là quá trình chuyển đổi 1 object thành 1 luồng byte để lưu trữ vào trong bộ nhớ.
  • Quá trình de-serialization là quá trình ngược của serialization, nó sử dụng các byte trong bộ nhớ để phục hồi lại object.
  • Các byte được serialize không phụ thuộc vào nền tảng nào cả. Do đó, 1 object có thể serialize trên 1 nền tảng và de-serialize trên 1 nền tảng khác.
  • Lợi ích của sử dụng quá trình serialization:
    • 1, Lưu giữ state và data của object. Do đó, object có thể phục hồi sau này.
    • 2, Có thể truyền 1 object sử dụng quá trình serialization qua network.
  • Trong java, chúng ta có thể thực hiện quá trình serialization thông qua Serializable interface.
  • Một số điểm lưu ý khi sử dụng Serializable:
    • 1, Nếu parent class implement Serializable interface thì child class không cần phải implement nó.
    • 2, Chỉ có non-static và non-transient variable có thể thực hiện quá trình serialization.
    • 3, Do static variable và transient variable không thực hiện được quá trình serialization do đó nếu bạn không muốn lưu trữ dữ liệu của non-static variable thì đánh dấu nó là transient.
    • 4, Constructor của object không được gọi khi object được phục hồi bằng de-serialization.
    • 5, Serialization sử dụng quá trình reflection.

II, Parcelable

  • Để tối ưu hoá, Android sử dụng Binder để tạo điều kiện giao tiếp giữa các component và Binder kết nối với Parcel là message container.
  • Inteface Parcelable là 1 interface dùng để truyền dữ liệu giữa các component trong Android.
  • Khi thực hiện truyền dữ liệu, các state và data của object sẽ được lưu vào trong 1 Parcel.
  • Sử dụng Parcelable nhanh gấp nhiều lần so với Serializable nhưng việc triển khai trong Java khá dài dòng.

    1, Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class MyParcelable implements Parcelable {
private int mIndex;

public int describeContents() {
return 0;
}

public void writeToParcel(Parcel out, int flags) {
out.writeInt(mIndex);
}

public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}

public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};

private MyParcelable(Parcel in) {
mIndex = in.readInt();
}
}
  • Bạn cần override và implement các method và class:
    • writeToParcel(): method ghi state và data của object vào trong 1 Parcel.
    • CREATOR: static variable dùng để phục hồi lại object từ Parcel.

2, Kotlin

  • Kotlin giúp bạn override các method và class trên. Bạn chỉ cần làm như sau:
1
2
3
4
// Add in build.gradle in the app level.
androidExtensions {
experimental = true
}
1
2
3
// Just add @Parcelize annotation and implement Parcelable interface.
@Parcelize
data class MyParcelable(val index: Int) : Parcelable

III, So sánh giữa Serializable and Parcelable

Serializable Parcelable
Dễ triển khai Trong java, tốn nhiều mã nguồn để triển khai.
Có thể sử dụng ở nhiều nền tảng Chỉ dành riêng cho Android
Chậm và sinh ra nhiều rác Nhanh hơn
Có thể truyền qua network Không thể truyền qua network.