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!