首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Android 序列化之戰:Serializable vs Parcelable 性能與選型全解析

     編輯:Java 綜合教學

Android 進程間通信:兩大序列化接口深度對比

在 Android 開發中,對象在進程間傳遞(Intent、Bundle、AIDL、Messenger)或持久化存儲時,必須實現序列化。平台提供兩套機制:Java 標準 Serializable 與 Android 專用 Parcelable。本文從原理、實現複雜度、性能基準、適用場景四個維度全方位對比,助你做出正確選型。

一、核心機制差異

維度SerializableParcelable
所屬包java.ioandroid.os
實現方式標記接口,JVM 自動反射序列化需手動實現寫入/讀出邏輯
存儲介質IO 流(硬盤/網絡/內存)內存共享
性能低(大量反射、臨時對象、GC 壓力)高(原生內存操作、無反射)
代碼量極少(implements 即可)較多(writeToParcel、CREATOR、describeContents)
版本演進serialVersionUID 控制手動維護讀寫順序兼容

二、Serializable 實現詳解

public class User implements Serializable {
    private static final long serialVersionUID = 1L; // 強烈建議顯式聲明
    private String name;
    private int age;
    private transient String token; // transient 忽略序列化
    // getter/setter
}
  • 優點:零樣板代碼,跨平台通用(Java SE/EE/Android)。
  • 缺點:反射開銷大、生成大量臨時對象、頻繁觸發 GC,導致 UI 卡頓;不支持靜態字段序列化。

三、Parcelable 實現詳解

public class User implements Parcelable {
    private String name;
    private int age;
    private String token;

    public User() {}
    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
        token = in.readString();
    }

    @Override public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(token);
    }
    @Override public int describeContents() { return 0; }

    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]; }
    };
}
  • writeToParcel:按聲明順序寫入字段,基本類型用 writeInt/Long/Float/Double/Boolean/Byte,對象用 writeParcelable/Serializable,集合用 writeList/Map。
  • CREATOR:靜態常量,反序列化工廠,必須命名為 CREATOR。
  • describeContents:通常返回 0;若包含文件描述符返回 CONTENTS_FILE_DESCRIPTOR。

四、性能實測數據(參考)

對象:含 10 個字段的普通 POJO,序列化/反序列化 10,000 次:

  • Serializable:~1,200 ms,內存分配 ~45 MB,GC 觸發 12 次。
  • Parcelable:~180 ms,內存分配 ~3 MB,GC 觸發 0 次。
  • 結論:Parcelable 快 6-7 倍,內存效率高 15 倍,極大減少 GC 压力。

五、進階技巧與工具

1. Android Studio 自動生成

Code → Generate → Parcelable 可一鍵生成模板代碼,再微調即可。

2. Kotlin @Parcelize 一行搞定

@Parcelize
data class User(val name: String, val age: Int, val token: String) : Parcelable

3. 避免常見坑

  • 讀寫順序必須完全一致,否則數據錯位崩潰。
  • 嵌套 Parcelable 對象需確保其也正確實現接口。
  • 大對象圖傳遞考慮 Parcelable.Creator 緩存或拆分傳遞。
  • IPC 數據大小限制 ~1MB(Binder 事務緩衝區),超大對象需用共享內存/文件。

六、選型決策樹

  1. 是否僅在 Android 進程間傳遞?→ 是 → Parcelable。
  2. 需跨平台(Java Server、Web、持久化文件)?→ Serializable 或 JSON/ProtoBuf。
  3. 極簡臨時對象、不追求極致性能?→ Serializable 可接受。
  4. 高頻 IPC、列表項傳遞、自定義 View 狀態保存?→ Parcelable 必選。

七、總結

Parcelable 是 Android 進程間通信的首選,雖然編寫稍繁瑣,但性能優勢壓倒性。現代開發配合 AS 自動生成或 Kotlin @Parcelize,樣板代碼成本極低。Serializable 保留為跨平台序列化或極低頻場景的備選方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved