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

Java 序列化深度對比:Serializable vs Parcelable 效能與選型指南

     編輯:Java 相關知識

序列化本質:對象持久化與傳輸

序列化是將對象狀態轉換為可存儲或可傳輸格式(位元組流)的過程;反序列化則是逆向操作。在 Java/Android 開發中,主要面臨兩種選擇:JDK 原生 Serializable 與 Android 專用 Parcelable。

Serializable:通用但較重

使用方式

public class User implements Serializable {
    private static final long serialVersionUID = 1L; // 強烈建議顯式聲明
    
    private String name;
    private int age;
    private transient String password; // 不序列化敏感字段
    
    // getter/setter...
}

核心機制

  • 基於反射機制,自動序列化所有非 transient 字段
  • I/O 操作:寫入磁碟或網路傳輸
  • 支援對象圖(循環引用、共享引用)

效能痛點

  • 大量反射調用,CPU 開銷大
  • 產生大量臨時對象,觸發頻繁 GC
  • 序列化數據體積較大(包含類描述信息)

Parcelable:Android 高效能之選

標準實現模板

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];
        }
    };
}

核心優勢

  • 記憶體中直接讀寫:無 I/O 開銷,速度比 Serializable 快 10 倍以上
  • 無反射開銷:手動控制讀寫順序和類型
  • Intent/Bundle 傳遞首選:Android 組件間通信標準

效能對比實測(百萬次序列化)

指標SerializableParcelable優勢倍數
序列化耗時~1200ms~180ms6.7x
反序列化耗時~1500ms~200ms7.5x
輸出體積~280 bytes~120 bytes2.3x
GC 壓力高低-

選型決策樹

需要持久化到磁碟/網路傳輸?
    是 → 考慮 Serializable / JSON / Protobuf
    否 → 僅 Android 組件間傳遞?
            是 → 強烈推薦 Parcelable
            否 → 跨平台通信?
                    是 → JSON / Protobuf / Avro
                    否 → 根據效能需求選擇

現代替代方案

  • Kotlin @Parcelize:編譯器自動生成 Parcelable 代碼,一行註解搞定
  • Gson/Moshi:JSON 序列化,跨平台、人類可讀、調試友好
  • Protocol Buffers:高效二進制格式,支援多語言、Schema 演進

總結

Android 開發中組件間傳遞對象,**首選 Parcelable**(或 Kotlin @Parcelize)。需要持久化或跨平台時,考慮 JSON 或 Protobuf。Serializable 因效能問題,不建議在高頻 Android IPC 場景使用。

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