Parcelable vs Serializable - Phiên bản chi tiết
Bài viết này cung cấp so sánh chi tiết giữa Parcelable và Serializable trên Android, cùng các ví dụ code hoàn chỉnh.
Serializable - Cơ chế chuẩn Java
Serializable là marker interface trong Java (java.io.Serializable). Không có phương thức nào cần triển khai. Cơ chế sử dụng reflection để chuyển object thành byte stream.
Đặc điểm:
implements SerializableVí dụ hoàn chỉnh:
import java.io.Serializable;
public class UserSerializable implements Serializable {
private static final long serialVersionUID = 1L; // Khuyến nghị có serialVersionUID
private String name;
private int age;
private String email;
public UserSerializable(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Getters...
public String getName() { return name; }
public int getAge() { return age; }
public String getEmail() { return email; }
}
Parcelable - Cơ chế tối ưu Android
Parcelable (android.os.Parcelable) được thiết kế riêng cho Android IPC. Yêu cầu triển khai thủ công các phương thức đọc/ghi, nhưng hiệu năng vượt trội.
Đặc điểm:
writeToParcel(), CREATOR, describeContents()Ví dụ hoàn chỉnh:
import android.os.Parcel;
import android.os.Parcelable;
public class UserParcelable implements Parcelable {
private String name;
private int age;
private String email;
public UserParcelable(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// Constructor đọc từ Parcel - THỨ TỰ PHẢI KHỚP VỚI writeToParcel
protected UserParcelable(Parcel in) {
name = in.readString();
age = in.readInt();
email = in.readString();
}
public static final Creator<UserParcelable> CREATOR = new Creator<UserParcelable>() {
@Override
public UserParcelable createFromParcel(Parcel in) {
return new UserParcelable(in);
}
@Override
public UserParcelable[] newArray(int size) {
return new UserParcelable[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
dest.writeString(email);
}
// Getters...
public String getName() { return name; }
public int getAge() { return age; }
public String getEmail() { return email; }
}
Best Practices & Mẹo
1. Sử dụng Android Studio auto-generate
Alt+Insert (Windows/Linux) hoặc Cmd+N (Mac) → Parcelable → Chọn fields → OK. IDE sẽ sinh toàn bộ code boilerplate.
2. serialVersionUID cho Serializable
Luôn khai báo private static final long serialVersionUID = 1L; để tránh lỗi InvalidClassException khi class thay đổi.
3. Parcelable với List/Array
// Ghi list dest.writeTypedList(items); // Đọc list in.readTypedList(items, Item.CREATOR);
4. Kết hợp cả hai (hiếm)
Có thể implements cả Serializable và Parcelable, ưu tiên Parcelable cho IPC nội bộ, Serializable cho lưu trữ file/network.
Kết luận
Parcelable là lựa chọn khuyến nghị cho Android development nhờ hiệu năng vượt trội. Chỉ dùng Serializable khi cần tương thích Java thuần túy hoặc dữ liệu rất đơn giản.