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.AppCompatActivitydata class MyData(val name: String, val age: Int, val sex: String) : Parcelable {// Parcelable implementationoverride 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!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

electron自定义窗口和右键菜单样式

前言 electron默认沿用系统UI&#xff0c;并没有提供很多接口供使用者定制样式&#xff0c;如果想要完全自定义的样式&#xff0c;目前我能想到的方案只能是通过前端自定义样式&#xff0c;然后通过进程通信来实现系统基础功能&#xff1a;最大/小化、关闭、拖动窗口等。 效果…

面试宝典进阶之关系型数据库面试题

D1、【初级】你都使用过哪些数据库&#xff1f; &#xff08;1&#xff09;MySQL&#xff1a;开源数据库&#xff0c;被Oracle公司收购 &#xff08;2&#xff09;Oracle&#xff1a;Oracle公司 &#xff08;3&#xff09;SQL Server&#xff1a;微软公司 &#xff08;4&#…

麒麟系统安装docker、mysql、clickhouse

1、查看麒麟系统版本信息 cat /etc/os-release 麒麟系统版本V10 64位操作系统 # uname -p x86_64 # uname -p aarch64 内核版本 # uname -r 4.19.90-24.4.v2101.ky10.x86_64 本操作为麒麟系统版本V10&#xff0c;x86_64操作系统 一&#xff0c;安装docker 文件&#xff1a…

MySQL数据库备份脚本(mysqldump)

数据库备份脚本 以下shell脚本的主要目的是备份数据库&#xff0c;并在需要时删除旧的备份文件以节省空间。它使用 mysqldump 命令来执行数据库备份&#xff0c;将备份文件存储在指定的路径下&#xff0c;并根据文件数量的阈值来删除旧的备份文件。扫描文章末尾二维码关注公众…

js(JavaScript)数据结构之队列(Queue)

什么是数据结构&#xff1f; 下面是维基百科的解释&#xff1a; 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装&#xff1a;一个数据结构可被视为两个函数之间的接口&#xff0c;或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

掌控电路之源:电子元器件中的开关探秘

在电子元器件中&#xff0c;开关是一种非常重要的组成部分&#xff0c;它能够控制电路的接通和断开&#xff0c;从而实现电路的各种功能。开关的作用是控制电流的通断&#xff0c;从而控制电路中的信号和能量的流动。本文将介绍电子元器件中开关的类型、作用和特点。 开关可以…

debug OpenBLAS library 和 应用示例

1. 构建openblas lib git clone gitgithub.com:OpenMathLib/OpenBLAS.git cd OpenBLAS/ 如果要安装在自定义文件夹中&#xff0c;可以修改 PREFIX 的定义&#xff1a; 将 PREFIX /opt/OpenBLAS 修改成 PREFIX ../local/ 然后构建&#xff1a; make -j make install 如果要…

基于filter的内存马

主要是通过过滤器来拦截severlet请求中的参数&#xff0c;作为过滤器中的参数&#xff0c;来调用自定义过滤器中的恶意函数 在这里我们分析一下filter的实现原理&#xff0c;循序渐进 Demo1&#xff1a; 直接使用filter模拟内存马效果&#xff1a; 1.配置一个简单的severlet的…

推荐VSCODE插件:为`package.json`添加注释信息

众所周知&#xff0c;JSON文件是不支持注释的&#xff0c;除了JSON5/JSONC之外&#xff0c;我们在开发项目特别是前端项目时&#xff0c;大量会用到JSON文件&#xff0c;特别是在编写package.json中的scripts时&#xff0c;由于缺少注释,当有大量的命令脚本时&#xff0c;就有了…

aigc 启动器 sd-webui-aki-v4 decode_base64_to_file

下载地址&#xff1a; SD-WebUI启动器 绘世-启动器 | 万物档案 decode_base64_to_file报错&#xff1a; File "E:\BaiduNetdiskDownload\stable diffusion\sd-webui-aki-v4\extensions\sd-webui-controlnet\scripts\external_code.py", line 7, in <module>fr…

Js进阶31-DOM 操作专题

1. JavaScript 的组成部分&#xff1a; ECMAScript&#xff1a;简称 ES&#xff0c;它是欧洲计算机协会&#xff0c;大概每年的六月中旬定制语法规范。DOM&#xff1a;全称 Document Object Model&#xff0c;即为文档对象类型。BOM&#xff1a;全称 Browser Object Model&…

给自己创建的GPTs添加Action(查天气)

前言 在这篇文章中&#xff0c;我将分享如何利用ChatGPT 4.0辅助论文写作的技巧&#xff0c;并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元&#xff0c;很多人并不是天天用GPT&#xff0c;只是偶尔用一下。 如果调用官方的GPT4接口&…

WebGL兼容性检查

引入文件WebGL.js class WebGL {static isWebGLAvailable () {try {const canvas document.createElement(canvas);return !!(window.WebGLRenderingContext && (canvas.getContext(webgl) || canvas.getContext(experimental-webgl)));} catch (e) {return false;}}…

Qt中QGraphicsView总体架构学习

前沿 前段时间学习了下如何在QGraphicsView架构中绘制刻度尺&#xff0c;主要是与OnPainter中进行比较的&#xff0c;那么今天就来详细讲解下我对QGraphicsView框架的认知吧~ 最近一段时间想学习下&#xff0c;如果我有不正确的&#xff0c;欢迎留言探讨哟~ QGraphicsView架…

[软件工具]AI软件离线表格识别工具使用教程图像转excel转表格可复制文字表格导出实时截图识别成表格

【官方框架地址】 https://github.com/PaddlePaddle/PaddleOCR.git 【算法介绍】 PaddleOCR是一个基于PaddlePaddle框架的开源光学字符识别&#xff08;OCR&#xff09;工具库&#xff0c;由百度公司开发。它提供了一套完整的OCR解决方案&#xff0c;包括文字检测、文字识别以…

使用 Apache PDFBox 操作PDF文件

简介 Apache PDFBox库是一个开源的Java工具&#xff0c;专门用于处理PDF文档。它允许用户创建全新的PDF文件&#xff0c;编辑现有的PDF文档&#xff0c;以及从PDF文件中提取内容。此外&#xff0c;Apache PDFBox还提供了一些命令行实用工具。 Apache PDFBox提供了创建、渲染、…

linux环境安装docker

一、Docker是什么? 当我们开发一个应用程序时&#xff0c;通常需要配置和安装各种软件、库和依赖项。而这些环境配置可能会因为不同的操作系统或版本而存在差异&#xff0c;导致应用在不同环境中运行出现问题。 Docker就像是一个集装箱&#xff0c;可以将应用程序及其所有依…

Java EE 博客系统(Servlet版)

文章目录 1. 基本情况2. 准备工作3. 博客列表页4. 博客详情页5. 实现登录6. 强制要求登录7. 显示用户信息8. 退出登录9. 发布博客10. 如果程序出现问题怎么办&#xff1f; 1. 基本情况 这里的博客系统主要是四个界面 博客列表页 显示出当前网站上都有哪些博客博客详情页 点击…

浅析ARMv8体系结构:A64指令集

文章目录 A64指令编码格式加载与存储指令寻址模式变基模式前变基模式后变基模式 PC相对地址模式 伪指令加载与存储指令的变种不同位宽的加载与存储指令多字节内存加载和存储指令基地址偏移量模式前变基模式后变基模式 跳转指令返回指令比较并跳转指令 其它指令内存独占访问指令…

面试题:MySQL误删表数据,如何快速恢复丢失的数据?

相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求&#xff0c;如果手法很稳那么很庆幸可以很快完成任务&#xff0c;很不幸某一天突然手一抖把表里的数据修改错误或者误删了&#xff0c;这个时候你会发现各种问题反馈接踵而来。 如果身边有BDA或者有这方面经…