Android Serializable 和 Parcelable 的详解以及代码示例(Kotlin)

1. Serializable和Parcelable的区别(简单记忆):

Serializable适用于简单的对象序列化,而Parcelable适用于需要更高效的对象序列化和反序列化的情况,特别是在Android开发中。

  • Serializable是Java平台的标准接口,适用于普通的对象序列化,使用Java的默认序列化机制,实现简单但性能较低。
  • Parcelable是Android平台特有的接口,适用于Android环境下的高效对象序列化,需要手动实现序列化和反序列化的逻辑,性能较高

2. 详细解释:

  • 效率
    Parcelable的效率更高,比Serializable快10倍以上。因为Parcelable是通过在内存中分配序列化数据的,而Serializable是通过类加载和反射处理的。

  • 使用场景
    Serializable方便Java中对象的序列化,可将对象存储在存储设备上。而Parcelable主要用于内存序列化,用于在Activity、Service、Receiver之间传输数据。

  • 代码侵入性
    Serializable自动序列化,不需要实现任何方法。而Parcelable需要实现writeToParcel和describeContents方法。

  • 数据存储
    Serializable会将整个对象数据存储,而Parcelable只存储对象具体内容,不存储名称等meta信息。因此Parcelable更省内存。

  • 使用难度
    Parcelable代码侵入性大,使用略复杂,需要手动实现序列化和反序列化的逻辑。Serializable使用简单,自动完成序列化,但需要处理异常。

  • 版本兼容性
    Parcelable性能高效,但在一定程度上降低了兼容性。Serializable兼容性更好,可以兼容不同Android版本。

所以一般来说,在内存之间数据传输建议使用Parcelable,跨进程存储建议使用Serializable。

3. 使用Serializable

data class MyData(val name: String, val age: Int, val sex: String) : Serializable {
    companion object {
        private const val serialVersionUID: Long = 1L
    }
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData = MyData("John", 25, "Male")

        val intent = Intent(this, YourActivity::class.java)
        intent.putExtra("myData", myData)
        startActivity(intent)
    }
}

4. 使用Parcelable

4.1 自定义

import android.content.Intent
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable
import androidx.appcompat.app.AppCompatActivity

data class MyData(val name: String, val age: Int, val sex: String) : Parcelable {
    // Parcelable implementation
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
        parcel.writeString(sex)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<MyData> {
        override fun createFromParcel(parcel: Parcel): MyData {
            return MyData(parcel)
        }

        override fun newArray(size: Int): Array<MyData?> {
            return arrayOfNulls(size)
        }
    }

    private constructor(parcel: Parcel) : this(
        name = parcel.readString()!!,
        age = parcel.readInt(),
        sex = parcel.readString()!!
    )
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val myData = MyData("John", 25, "Male")

        val bundle = Bundle()
        bundle.putParcelable("myData", myData)

        val intent = Intent(this, YourActivity::class.java)
        intent.putExtra("myDataBundle", bundle)
        startActivity(intent)
    }
}

4.2 使用@Parcelize

使用最新parcelize插件
https://developer.android.com/kotlin/parcelize?hl=zh-cn#groovy

plugins {
    id 'kotlin-parcelize'
}

当使用 @Parcelize 为类添加注解时,系统会自动生成一个 Parcelable 实现,如以下示例所示:

import kotlinx.parcelize.Parcelize

@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

如果需要更高级的序列化逻辑,请将其写在某个伴随类中:

@Parcelize
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable {
    private companion object : Parceler<User> {
        override fun User.write(parcel: Parcel, flags: Int) {
            // Custom write implementation
        }

        override fun create(parcel: Parcel): User {
            // Custom read implementation
        }
    }
}

Thank you for your reading. Best Regard!

你可能感兴趣的:(Android,夯实基础,android,kotlin,开发语言)