ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/9/13 10:58:59 拓冰建站 浏览量
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.AppCompatActivitydata class MyData(val name: String, val age: Int, val sex: String) : Parcelable {// Parcelable implementationoverride 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!