日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android序列化實現接口Serializable與Parcelable詳解_Android

作者:懶到死的程序員 ? 更新時間: 2023-01-03 編程語言

一、Serializable(對象)

只需要實現Serializable 接口即可。將一個對象序列化轉換成可存儲或傳輸的狀態,然后再強轉回來使用(反序列化)。

class Person : Serializable {
    var name = ""
    var age = 0
}
//傳遞
OneActivity {
    val person = Person().apply {
        name = "張三"
        age = 18
    }
    Intent(this, TwoActivity::class.java).also {
        it.putExtra("person", person)
        startActivity(it)
    }
}
//獲取
TwoActivity {
    val person = intent.getSerializableExtra("person") as Person    //反序列化成對象
}

二、Parcelable(屬性)

將一個對象進行分解,分解后的每一個屬性都是Intent 所支持的數據類型。

2.1 實現方式(不推薦)

創建一個類實現 Parcelable 接口,定義好屬性,按 ctrl+1 編譯器會自動幫我們生成。

  • 實現 Parcelable 接口,重寫 describeContents() 和 writeToParcel() 兩個函數。describeContents() 直接返回 0 就行。writeToParcel() 調用 writeXXX() 將類中屬性一一寫入。
  • 創建一個名為 CREATOR 的伴生對象實現 Parcelable.Creator 接口,將泛型類型指定為<Person>,重寫 createFromParcel() 和 newArray() 兩個函數。createFromParcel()中創建一個 Person 對象返回,并調用 readXXX() 將之前寫入的屬性一一讀出(注意讀寫的順序要一致)。newArray()中調用 arrayOfNulls() 傳入形參 size 作為數組大小即可。
class Person() : Parcelable {
    var name = ""
    var age = 0
    constructor(parcel: Parcel) : this() {
        //讀出
        name = parcel.readString() ?: ""
        age = parcel.readInt()
    }
    //寫入
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }
    //返回0就行
    override fun describeContents(): Int {
        return 0
    }
    //伴生對象實現接口
    companion object CREATOR : Parcelable.Creator<Person> {
        //返回對象
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }
        //返回一個數組,形參 size 作為數組大小
        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}
//傳遞方式和 Serializable 一樣,使用如下:
TwoActivity {
    val person = intent.getParcelableExtra("person")
}

2.2 注解方式(推薦)

Kotlin提供了更簡便的寫法,傳遞的屬性都需要定義在主構造中。

//Module Gradle 引入插件
plugins {
    id 'kotlin-parcelize'
}
//使用
@Parcelize
class Person(val name: String, var age: Int) : Parcelable

原文鏈接:https://blog.csdn.net/HugMua/article/details/127876903

欄目分類
最近更新