序列化是將對象狀態轉換為可存儲或可傳輸格式(位元組流)的過程;反序列化則是逆向操作。在 Java/Android 開發中,主要面臨兩種選擇:JDK 原生 Serializable 與 Android 專用 Parcelable。
public class User implements Serializable {
private static final long serialVersionUID = 1L; // 強烈建議顯式聲明
private String name;
private int age;
private transient String password; // 不序列化敏感字段
// getter/setter...
}
public class User implements Parcelable {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = 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; // 含 FileDescriptor 時返回 1
}
// 必須的 CREATOR 靜態常量
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
}
| 指標 | Serializable | Parcelable | 優勢倍數 |
|---|---|---|---|
| 序列化耗時 | ~1200ms | ~180ms | 6.7x |
| 反序列化耗時 | ~1500ms | ~200ms | 7.5x |
| 輸出體積 | ~280 bytes | ~120 bytes | 2.3x |
| GC 壓力 | 高 | 低 | - |
需要持久化到磁碟/網路傳輸?
是 → 考慮 Serializable / JSON / Protobuf
否 → 僅 Android 組件間傳遞?
是 → 強烈推薦 Parcelable
否 → 跨平台通信?
是 → JSON / Protobuf / Avro
否 → 根據效能需求選擇
Android 開發中組件間傳遞對象,**首選 Parcelable**(或 Kotlin @Parcelize)。需要持久化或跨平台時,考慮 JSON 或 Protobuf。Serializable 因效能問題,不建議在高頻 Android IPC 場景使用。