Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Khác biệt giữa Parcelable và Serializable trên Android (bản cập nhật)

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:

    Dễ triển khai: chỉ thêm implements Serializable Tự động xử lý serialization Chậm do reflection và tạo nhiều object tạm Phù hợp: dữ liệu đơn giản, ít truyền qua Intent/Bundle

Ví 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:

    Nhanh hơn Serializable 10-20 lần Không dùng reflection Ít tạo object rác (garbage) Bắt buộc implement: writeToParcel(), CREATOR, describeContents() Phù hợp: truyền dữ liệu phức tạp, danh sách lớn, high-frequency IPC

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.