Android序列化实现接口Serializable与Parcelable详解

 更新时间:2022年12月07日 10:36:56   作者:懒到死的程序员  
我们使用 Intent 传递数据的时候,putExtra() 所支持的数据类型事有限的,当需要传递自定义对象的时候就需要序列化。Serializable更简单但是会把整个对象进行序列化因此效率比Parcelable低一些

一、Serializable(对象)

只需要实现Serializable 接口即可。将一个对象序列化转换成可存储或传输的状态,然后再强转回来使用(反序列化)。

class Person : Serializable {
    var name = ""
    var age = 0
}
//传递
OneActivity {
    val person = Person().apply {
        name = "张三"
        age = 18
    }
    Intent(this, TwoActivity::class.java).also {
        it.putExtra("person", person)
        startActivity(it)
    }
}
//获取
TwoActivity {
    val person = intent.getSerializableExtra("person") as Person    //反序列化成对象
}

二、Parcelable(属性)

将一个对象进行分解,分解后的每一个属性都是Intent 所支持的数据类型。

2.1 实现方式(不推荐)

创建一个类实现 Parcelable 接口,定义好属性,按 ctrl+1 编译器会自动帮我们生成。

  • 实现 Parcelable 接口,重写 describeContents() 和 writeToParcel() 两个函数。describeContents() 直接返回 0 就行。writeToParcel() 调用 writeXXX() 将类中属性一一写入。
  • 创建一个名为 CREATOR 的伴生对象实现 Parcelable.Creator 接口,将泛型类型指定为<Person>,重写 createFromParcel() 和 newArray() 两个函数。createFromParcel()中创建一个 Person 对象返回,并调用 readXXX() 将之前写入的属性一一读出(注意读写的顺序要一致)。newArray()中调用 arrayOfNulls() 传入形参 size 作为数组大小即可。
class Person() : Parcelable {
    var name = ""
    var age = 0
    constructor(parcel: Parcel) : this() {
        //读出
        name = parcel.readString() ?: ""
        age = parcel.readInt()
    }
    //写入
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(name)
        parcel.writeInt(age)
    }
    //返回0就行
    override fun describeContents(): Int {
        return 0
    }
    //伴生对象实现接口
    companion object CREATOR : Parcelable.Creator<Person> {
        //返回对象
        override fun createFromParcel(parcel: Parcel): Person {
            return Person(parcel)
        }
        //返回一个数组,形参 size 作为数组大小
        override fun newArray(size: Int): Array<Person?> {
            return arrayOfNulls(size)
        }
    }
}
//传递方式和 Serializable 一样,使用如下:
TwoActivity {
    val person = intent.getParcelableExtra("person")
}

2.2 注解方式(推荐)

Kotlin提供了更简便的写法,传递的属性都需要定义在主构造中。

//Module Gradle 引入插件
plugins {
    id 'kotlin-parcelize'
}
//使用
@Parcelize
class Person(val name: String, var age: Int) : Parcelable

到此这篇关于Android序列化实现接口Serializable与Parcelable详解的文章就介绍到这了,更多相关Android Serializable与Parcelable内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android中使用Service实现后台发送邮件功能实例

    Android中使用Service实现后台发送邮件功能实例

    这篇文章主要介绍了Android中使用Service实现后台发送邮件功能的方法,结合实例形式分析了Service实现邮件的发送、接收及权限控制相关技巧,需要的朋友可以参考下
    2016-01-01
  • Flutter实战教程之酷炫的开关动画效果

    Flutter实战教程之酷炫的开关动画效果

    这篇文章主要给大家介绍了关于Flutter实战教程之酷炫的开关动画效果的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 用Kotlin实现Android点击事件的方法

    用Kotlin实现Android点击事件的方法

    本篇文章主要介绍了用Kotlin实现Android点击事件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android Flutter表格组件Table的使用详解

    Android Flutter表格组件Table的使用详解

    Table组件不同于其它Flex布局,它是直接继承的RenderObjectWidget的。本篇文章主要介绍如何在页面中使用表格做一个记录,感兴趣的可以尝试一下
    2022-06-06
  • Android中注解处理器APT用法示例

    Android中注解处理器APT用法示例

    APT全称Annotation Processing Tool,即注解处理器,APT是一种处理注释的工具, 它对源代码文件进行检测找出其中的注解,并使用注解进行额外的处理,给我们自动生成代码,简化使用,很多流行框架都使用到了APT技术,如 ButterKnife,Retrofit,Arouter,EventBus 等等
    2023-12-12
  • Android自定义ViewPager实例

    Android自定义ViewPager实例

    这篇文章主要介绍了Android自定义ViewPager的方法,结合完整实例形式分析了Android基于ViewGroup类自定义ViewPager的具体实现技巧,需要的朋友可以参考下
    2016-02-02
  • android全屏去掉title栏的多种实现方法

    android全屏去掉title栏的多种实现方法

    android全屏去掉title栏包括以下几个部分:实现应用中的所有activity都全屏/实现单个activity全屏/实现单个activity去掉title栏/自定义标题内容/自定义标题布局等等感兴趣的可参考下啊
    2013-02-02
  • Android实现登录界面的注册功能

    Android实现登录界面的注册功能

    这篇文章主要为大家详细介绍了Android实现登录界面的注册功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android实现注册界面

    Android实现注册界面

    这篇文章主要为大家详细介绍了Android实现注册界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

    Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多

    这篇文章主要介绍了Android程序开发之Listview下拉刷新上拉(滑动分页)加载更多的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07

最新评论