[Android]序列化原理Parcelable

简介: [Android]序列化原理Parcelable

Parcelable是Android为我们提供的序列化的接口,Parcelable相对于Serializable的使用相对复杂一些,但Parcelable的效率相对Serializable也高很多,这一直是Google工程师引以为傲的,Parcelable和Serializable的效率对比Parcelable vs Serializable号称快10倍的效率

Parcelable是Android SDK提供的,它是基于内存的,由于内存读写速度高于硬盘,由此Android中的跨进程对象的传递一般使用Parcelable

Parcelable实现生成器


kotlin-parcelize 插件提供了一个 Parcelable 实现生成器,将以下 Gradle 插件添加到应用的 build.gradle 文件中:

plugins {

   id("kotlin-parcelize")

}

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

import kotlinx.parcelize.Parcelize
@Parcelize
class User(val firstName: String, val lastName: String, val age: Int): Parcelable

要注意的是:@Parcelize 要求在主要构造函数中声明所有序列化属性。

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

@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
        }
    }
}

Parcelable序列化过程的源码解析


Parcelable接口

Parcelable接口里面有个writeToParcel方法

到writeToParcel方法的Parcel类里面来,Parcel相对于快递员的包裹,需要我们把数据写到Parcel里面去,然后收件人可以从包裹从获取数据。

Parcel里面有一系列的native方法,native方法是干什么的呢?native方法就是把我们的数据类型写进去。

总得来说: Parcelable通过Parcel实现读和写,从而实现序列化和反序列化

Parcelable序列化基本方法


private fun test() {
        var parcel:Parcel=Parcel.obtain()
        parcel.writeInt(19)
        parcel.writeInt(12)
        //marshall方法转换成二进制
        val bs=parcel.marshall()
        Log.d("data","bs=${bs.size}")
        //把parcel释放掉
        parcel.setDataPosition(0)
        parcel.recycle()
        //重新获取一个parcel
        parcel=Parcel.obtain()
        //把bs字节流放到parcel里面去
        parcel.unmarshall(bs,0,bs.size)
        //把parcel里面的值读取出来
        val size=parcel.dataSize()
        for(i in 0..size step 4){
            parcel.setDataPosition(i)
            Log.d("data","value=${parcel.readInt()}")
        }
        parcel.recycle()
    }

Parcelable进程间传递对象


创建Course类实现Parcelable接口

@Parcelize
class Course(var name:String, var score:Int) :Parcelable{
}

在一个activity中写下如下代码

val course=Course("数学",99)
        var intent=Intent(this,MainActivity4::class.java)
        intent.putExtra("data",course)
        startActivity(intent)

在另一个activity中写下如下代码

var course=intent.getParcelableExtra<Course>("data")
        if (course != null) {
            Log.d("data","${course.name}---${course.score}")
        }

结果展示

D/data: 数学---99

Parcelable和Serializable如何选择


1.在使用内存方面,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性,在外界有变化的情况下,建议使用Serializable。

目录
相关文章
|
3月前
|
安全 Android开发 Kotlin
Android经典实战之SurfaceView原理和实践
本文介绍了 `SurfaceView` 这一强大的 UI 组件,尤其适合高性能绘制任务,如视频播放和游戏。文章详细讲解了 `SurfaceView` 的原理、与 `Surface` 类的关系及其实现示例,并强调了使用时需注意的线程安全、生命周期管理和性能优化等问题。
184 8
|
1月前
|
缓存 Java 数据库
Android的ANR原理
【10月更文挑战第18天】了解 ANR 的原理对于开发高质量的 Android 应用至关重要。通过合理的设计和优化,可以有效避免 ANR 的发生,提升应用的性能和用户体验。
124 56
|
2月前
|
XML 前端开发 Android开发
Android View的绘制流程和原理详细解说
Android View的绘制流程和原理详细解说
51 3
|
3月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
51 2
|
3月前
|
编解码 前端开发 Android开发
Android经典实战之TextureView原理和高级用法
本文介绍了 `TextureView` 的原理和特点,包括其硬件加速渲染的优势及与其他视图叠加使用的灵活性,并提供了视频播放和自定义绘制的示例代码。通过合理管理生命周期和资源,`TextureView` 可实现高效流畅的图形和视频渲染。
299 12
|
2月前
|
Java 调度 Android开发
Android面试题之Kotlin中async 和 await实现并发的原理和面试总结
本文首发于公众号“AntDream”,详细解析了Kotlin协程中`async`与`await`的原理及其非阻塞特性,并提供了相关面试题及答案。协程作为轻量级线程,由Kotlin运行时库管理,`async`用于启动协程并返回`Deferred`对象,`await`则用于等待该对象完成并获取结果。文章还探讨了协程与传统线程的区别,并展示了如何取消协程任务及正确释放资源。
41 0
|
4月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
4月前
|
自然语言处理 JavaScript 前端开发
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
JDK序列化原理问题之FuryJDK序列化性能问题的如何解决
|
4月前
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
141 0
|
5月前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
70 6