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!

相关推荐

  1. kotlin 注解 @Parcelize 使用

    2024-01-14 01:16:02       14 阅读
  2. kotlin 简单实现实体类Parcelable序列化接口

    2024-01-14 01:16:02       38 阅读
  3. C++中类型转换概念详解示例代码

    2024-01-14 01:16:02       34 阅读
  4. serializableparcelable区别(GPT回答)

    2024-01-14 01:16:02       39 阅读
  5. kotlin接口详解

    2024-01-14 01:16:02       31 阅读
  6. kotlin基础学习教程以及代码案例

    2024-01-14 01:16:02       17 阅读
  7. CountDownLatch详解以及用法示例

    2024-01-14 01:16:02       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-14 01:16:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-14 01:16:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-14 01:16:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-14 01:16:02       18 阅读

热门阅读

  1. 【Kotlin】中英数字混合等多种情况下的排序方式

    2024-01-14 01:16:02       41 阅读
  2. OLAP型数据库 ClickHouse的简介 应用场景 优势 不足

    2024-01-14 01:16:02       41 阅读
  3. xtu-c语言考试复习

    2024-01-14 01:16:02       40 阅读
  4. C#的索引和范围运算符的用法

    2024-01-14 01:16:02       29 阅读
  5. 一个Pytorch 的简单的分类本地图片的训练AI例子

    2024-01-14 01:16:02       40 阅读
  6. 50天精通Golang(第16天)

    2024-01-14 01:16:02       42 阅读
  7. Linux上对大于2T的硬盘分区

    2024-01-14 01:16:02       38 阅读
  8. 常用电容功能以及型号

    2024-01-14 01:16:02       42 阅读
  9. Python装饰器管理类和函数

    2024-01-14 01:16:02       47 阅读
  10. PyTorch简单易懂的解析 Dropout Layers应用,代码示例

    2024-01-14 01:16:02       36 阅读
  11. Python正则表达式中sub和replace的区别

    2024-01-14 01:16:02       44 阅读
  12. 信息安全面试攻略

    2024-01-14 01:16:02       41 阅读