| 維度 | Serializable | Parcelable |
|---|---|---|
| 所屬包 | java.io | android.os |
| 實現方式 | 標記接口,無需方法 | 需實現 writeToParcel/describeContents + CREATOR |
| 序列化機制 | 反射 + I/O 流 | 手寫二進制讀寫 |
| 性能 | 慢 (反射開銷大,生成大量臨時對象) | 快 (官方推薦,優化內存佈局) |
| 適用場景 | 網絡傳輸、文件持久化、跨進程 (需兼容非 Android) | Intent 傳遞、Binder IPC、SharedPreferences 存對象 |
| 版本兼容 | serialVersionUID 控制 | 手動維護讀寫順序 |
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// getter/setter
}
public class User implements Parcelable {
private String name;
private int age;
protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
@Override
public int describeContents() { return 0; }
public static final Creator CREATOR = new Creator() {
@Override public User createFromParcel(Parcel in) { return new User(in); }
@Override public User[] newArray(int size) { return new User[size]; }
};
// getter/setter
}
現代開發可用 @Parcelize (Kotlin) 或 Android Studio 插件自動生成樣板代碼。
Parcel (共享內存池),無反射、無額外對象分配。Parcel 內部維護字節數組池,IPC 時直接映射內存,極其高效。Intent.putExtra、Bundle、AIDL、Messenger → 必須 Parcelable。Parcel.writeToFile),但可讀性差,不如 JSON。Parcelable 警告且性能差,嚴禁生產環境大量使用。Android 內部傳遞用 Parcelable,外部持久化/通信用 Serializable/JSON/Protobuf。Parcelable 雖代碼多,但性能優勢決定性,且工具可自動生成,無理由不用。