Android

Parcelable vs Serializable

Giới thiệu

Khi bắt đầu làm quen với Android, tất cả chúng ta đều biết không thể chuyển các tham chiếu đối tượng cho các Activity và Fragment, chúng ta phải đặt chúng trong các Intent/Bundle.

Nhưng, vấn đề ở đây là chúng ta có hai tùy chọn. Khi bắt đầu làm quen với Java thì chúng ta biết đến Serializable và khi chuyển sang Android chúng ta lại biết đến Parcelable. Vậy Parcelable và Serializable cái nào tốt hơn?

Để trả lời câu hỏi này, chúng ta hãy xem xét cả hai cách tiếp cận.

Serializable, bậc thầy của sự đơn giản

Serialization là một interface giúp chúng ta có thể chuyển đổi trạng thái của một JO(Java Object) thành một định dạng nào đó để JO này có thể được lưu trữ ở đâu đó và sau đó, nó sẽ được sử dụng bởi một tiến trình khác như gửi một JO từ Activity/Fragment này đến một Activity/Fragment khác, vân vân mà mây mây.

Và khi một tiến trình khác sử dụng một JO đã được Serialization, nó sẽ chuyển đổi định dạng đã Serialization về trạng thái của Java object ban đầu. Nhờ vậy, tiến trình đó có thể sử dụng lại JO của chúng ta.

Cái hay của Serializable là bạn chỉ cần implements interface Serializable trên một lớp và các con của nó. Nó là một marker interface, có nghĩa là không có phương thức để implementation, Java sẽ chỉ đơn giản là nỗ lực hết sức để tuần tự hóa nó một cách hiệu quả.

Vấn đề với phương pháp này là nó sử dụng Reflection và nó là một quá trình chậm. Cơ chế này cũng có xu hướng tạo ra nhiều đối tượng tạm thời và gây ra khá nhiều bộ sưu tập rác.

Túm cái váy lại, Serialization đơn giản chỉ là chuyển từ một object tồn tại thành một mảng byte. Mảng byte này đại diện cho class của object, phiên bản của object, và trạng thái của object. Mảng byte này có thể được sử dụng giữa các máy ảo JVM đang chạy cùng code truyền / đọc các object.

Vẫn chưa hiểu, xem qua ví dụ sẽ rõ:

public class ReportDetail implements Serializable {

private String ServiceType;

private String branch;

private int period;

private String subParentDesc;

//getter, setter, constructer…
}

Parcelable, Vua tốc độ

Tương tự như Serializable, Parcelable cũng giúp chuyển từ một object tồn tại thành một mảng byte.

Theo các kỹ sư của google , Parcelable sẽ chạy nhanh hơn đáng kể. Một trong những lý do cho điều này là Parcelable sử dụng Serialization thay vì sử dụng Reflection. Cũng có lý do rằng mã đã được tối ưu hóa mạnh mẽ cho mục đích này.

Tuy nhiên, rõ ràng ở đây là việc triển khai Parcelable không đơn giản như Serializable. Có một số lượng đáng kể mã soạn sẵn và nó làm cho các lớp khó đọc và duy trì hơn.

public class ReportDetail implements Parcelable {

private String ServiceType;

private String branch;

private int period;

private String subParentDesc;

protected ReportDetail(Parcel in) {

ServiceType = in.readString();

branch = in.readString();

period = in.readInt();

subParentDesc = in.readString();

}

public static final Creator<ReportDetail> CREATOR = new Creator<ReportDetail>() {

@Override

public ReportDetail createFromParcel(Parcel in) {

return new ReportDetail(in);

}

@Override

public ReportDetail[] newArray(int size) {

return new ReportDetail[size];

}

};

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel parcel, int i) {

parcel.writeString(ServiceType);

parcel.writeString(branch);

parcel.writeInt(period);

parcel.writeString(subParentDesc);

}

//getter, setter, constructer…

}

Kiểm tra tốc độ

Tất nhiên, chúng tôi muốn biết Parcelable nhanh hơn bao nhiêu.

Phương pháp luận

  • Bắt chước quá trình chuyển Object đến một Activity/Fragment bằng cách đặt một Object vào một Bundle và gọi Bundle # writeToParcel (Parcel, int)  và sau đó tìm nạp lại.
  • Chạy cái này trong một vòng lặp 1000 lần
  • Thực hiện trung bình trên 10 lần chạy riêng biệt để phân bổ bộ nhớ, các ứng dụng khác sử dụng cpu, v.v.
  • Đối tượng được thử nghiệm là Serializable và Parcelable được nêu ở trên
  • Thử nghiệm trên nhiều thiết bị – phiên bản Android
    • LG Nexus 4 – Android 4.2.2 
    • Samsung Nexus 10 – Android 4.2.2
    • HTC Desire Z – Android 2.3.3

Kết quả

phân chia so với tuần tự
Parcelable nhanh hơn gấp 10 lần so với serializable! 

Kết luận

  1. Parcelable nhanh hơn Serializable
  2. Parcelable mất nhiều thời gian hơn để thực hiện so với Serializable
  3. Serializable dễ thực hiện hơn
  4. Serializable tạo ra rất nhiều đối tượng tạm thời và gây ra khá nhiều bộ sưu tập rác

Nếu bạn muốn trở thành một “siêu developer”, hãy dành thêm thời gian để triển khai Parcelable vì nó sẽ thực hiện nhanh hơn 10 lần và sử dụng ít tài nguyên hơn.

Tuy nhiên, trong hầu hết các trường hợp, sự chậm chạp của Serializable sẽ không được chú ý. Hãy sử dụng nó nhưng hãy nhớ rằng Serialization là một “hoạt động đắt tiền” vì vậy hãy giữ nó ở mức tối thiểu.

Được gắn thẻ , , ,

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *