首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 序列化接口對比:Serializable vs Parcelable 區別、性能與適用場景

     編輯:程式設計疑難解答

核心區別速覽

維度SerializableParcelable
所屬包java.ioandroid.os
實現方式標記接口,無需方法需實現 writeToParcel/describeContents + CREATOR
序列化機制反射 + I/O 流手寫二進制讀寫
性能慢 (反射開銷大,生成大量臨時對象)快 (官方推薦,優化內存佈局)
適用場景網絡傳輸、文件持久化、跨進程 (需兼容非 Android)Intent 傳遞、Binder IPC、SharedPreferences 存對象
版本兼容serialVersionUID 控制手動維護讀寫順序

代碼實現對比

Serializable:極簡


public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    // getter/setter
}

Parcelable:標準範式


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 插件自動生成樣板代碼。

性能深度解析

  • Serializable:反射遍歷所有字段 (含私有、繼承)、寫入流帶類型信息、反序列化創建大量字符串對象。
    典型 10 字段對象:Parcelable 約 10-20μs,Serializable 約 100-200μs (10x 差距)。
  • Parcelable:預知結構,直接讀寫基本類型到 Parcel (共享內存池),無反射、無額外對象分配。
    Parcel 內部維護字節數組池,IPC 時直接映射內存,極其高效。

選擇指南

  1. Android 組件間通信:Intent.putExtra、Bundle、AIDL、Messenger → 必須 Parcelable。
  2. 網絡請求/響應、文件緩存、跨平台數據交換:Serializable 或更優的 JSON (Gson/Moshi)、Protobuf。
  3. 混合場景:類實現兩個接口,按用途選擇傳遞方式。

常見誤區

  • 「Parcelable 只能用於 IPC」:錯。也可用於文件存儲 (Parcel.writeToFile),但可讀性差,不如 JSON。
  • 「Serializable 不能用於 Intent」:能用,但會觸發 Parcelable 警告且性能差,嚴禁生產環境大量使用。

總結

Android 內部傳遞用 Parcelable,外部持久化/通信用 Serializable/JSON/Protobuf。Parcelable 雖代碼多,但性能優勢決定性,且工具可自動生成,無理由不用。

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