赞
踩
Serializable适用于简单的对象序列化,而Parcelable适用于需要更高效的对象序列化和反序列化的情况,特别是在Android开发中。
Serializable是Java平台的标准接口,适用于普通的对象序列化,使用Java的默认序列化机制,实现简单但性能较低。Parcelable是Android平台特有的接口,适用于Android环境下的高效对象序列化,需要手动实现序列化和反序列化的逻辑,性能较高。效率
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。
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) } }
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) } }
使用最新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!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。