Android Parcelable實現Java對象的序列化

Android開發中,我們需要在不同組件(Activity、Service、BroadcastReceiver等)之間傳遞數據,有的時候甚至需要把對象直接傳遞過去。這時候就需要對Java對象進行序列化。Java序列化和反序列化雖然非常方便,但是它的效率很低。而Android提供的Parcelable接口就解決了這個問題,它可以較為高效地序列化和反序列化數據,並且適合在內存之間傳遞對象。

一、Parcelable接口的介紹

Parcelable是Android特有的輕量級序列化方法。與Java的Serializable相比,Parcelable更快更輕巧,而且是一種顯式的序列化方法。它通過將數據一次性寫入或讀取內存塊來完成序列化和反序列化,相對而言效率更高。

Android平台中提供的許多類已經實現了Parcelable接口,例如Intent、Bundle和Cursor等。如果我們需要在自己的類中使用Parcelable,則需要實現Parcelable接口,並實現writeToParcel()和createFromParcel()這兩個方法。

二、實現Parcelable接口

實現Parcelable接口需要以下幾個步驟:

1、定義一個實現Parcelable接口的類:

public class User implements Parcelable {
    private String userName;
    private int age;

    //構造方法
    public User(String userName, int age) {
        this.userName = userName;
        this.age = age;
    }

    //Getter和Setter方法
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //實現Parcelable接口
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.userName);
        dest.writeInt(this.age);
    }

    protected User(Parcel in) {
        this.userName = in.readString();
        this.age = in.readInt();
    }

    public static final Creator CREATOR = new Creator() {
        @Override
        public User createFromParcel(Parcel source) {
            return new User(source);
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
}

2、實現Parcelable接口中的抽象方法describeContents(),返回0即可。

3、實現Parcelable接口中的抽象方法writeToParcel(Parcel dest, int flags),將需要序列化的數據寫入Parcel中。

4、實現Parcelable接口中的構造方法,將需要反序列化的數據讀取出來。注意:讀取數據的順序必須與寫入數據的順序一致。

5、實現Parcelable接口中的CREATOR靜態變量,用於反序列化數據。其中包含兩個抽象方法createFromParcel(Parcel source)和newArray(int size)。

三、使用Parcelable序列化對象

使用Parcelable序列化Java對象需要以下幾個步驟:

1、將需要傳遞的Java對象打包成Parcel對象:

User user = new User("Tom", 25);
Parcel parcel = Parcel.obtain();
user.writeToParcel(parcel, 0);

2、通過Bundle將Parcel對象傳遞給需要的組件,例如Activity:

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user", parcel);
intent.putExtras(bundle);
startActivity(intent);

3、將Parcel對象傳遞給需要的組件:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Parcel parcel = bundle.getParcelable("user");
User user = User.CREATOR.createFromParcel(parcel);

四、總結

Parcelable是Android特有的一種序列化方法,與Java的Serializable相比,Parcelable更快更輕巧,並且適合在內存之間傳遞對象。使用Parcelable序列化Java對象需要實現Parcelable接口,並實現writeToParcel()和createFromParcel()這兩個方法。將需要傳遞的Java對象打包成Parcel對象,通過Bundle將Parcel對象傳遞給需要的組件,將Parcel對象傳遞給需要的組件並進行反序列化即可。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/293479.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-26 13:14
下一篇 2024-12-26 13:14

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • 面向對象編程、類和對象

    面向對象編程(Object-Oriented Programming, OOP)是一種編程方法,它將現實世界中的事物抽象為對象(Object),對象的屬性和方法被封裝成類(Clas…

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • Mapster:一個高性能的對象映射庫

    本文將深入介紹furion.extras.objectmapper.mapster,一個高性能的對象映射庫,解釋它是如何工作的以及如何在你的項目中使用它。 一、輕鬆地實現對象之間的…

    編程 2025-04-28
  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控件。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Python返回對象類型

    Python是一種動態、解釋型、高級編程語言。Python是一種面向對象的語言,即所有的一切都是一個對象。 一、基本類型 Python中的基本類型有整數int、浮點數float、布…

    編程 2025-04-28
  • Python中通過對象不能調用類方法和靜態方法的解析

    當我們在使用Python編寫程序時,可能會遇到通過對象調用類方法和靜態方法失敗的問題,那麼這是為什麼呢?接下來,我們將從多個方面對這個問題進行詳細解析。 一、類方法和靜態方法的定義…

    編程 2025-04-27
  • Python內置函數——查看對象內存

    本文將介紹Python內置函數中,在開發中查看對象內存的相關函數。 一、id()函數 id()函數是Python內置函數,用於返回對象的唯一標識符,也就是對象在內存中的地址。 nu…

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27

發表回復

登錄後才能評論