Android必备回顾:5、谈谈Serializable 接口和Parcelable 接口的区别?

本文主要是介绍Android必备回顾:5、谈谈Serializable 接口和Parcelable 接口的区别?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Serializable 接口

Parcelable接口

内存中使用 Parcelable

持久化使用 Serializable

总结


谈谈Serializable 接口和Parcelable 接口的区别?
那么谈到这样的问题呢,我们平时在android 的开发过程中,那么主要用到的序列化手段,也就是这两种方式。
 

Serializable 接口

那么第一种方式是Serializable 接口,那么它是序列化的意思。这个单词本身就是序列化的意思。
它主要是java 中自带的,那么它表示将一个对象转换成可存储或可传输的状态。
那么序列化以后的对象可以在网络上进行传输,也可以存储到本地。

那么一般来说我们平时在使用过程中,更多的情况我们会使用 Serializable 来进行数据持久化的操作。

Parcelable接口

那么在安卓中呢,提出了 Parcelable 这样的序列化工具。
在我们安卓中这个 Parcelable 序列化这个工具,不同于之前的我们的Serializable。

其主要的一个最重要的部分。就是它用于分解后的每一部分,它对我们一个对象进行分解。那么在分解以后呢,它的每一部分都是 intent 所支持的所有的数据类型。

那么这样呢,也就实现了传递对象这样的功能了。
当然他要做持久化也是可以做的。但是他持久化这个方面呢有很多弊端。

  

那么这里呢,我们可以一起来看一下我们选择序列化方法的这个原理。
我们怎么去选择这两种不同的序列化呢?

内存中使用 Parcelable

如果说我们在使用内存情况下,使用内存来进行序列化传输的时候,我们使用 Parcelable 它会比 Serializable 的性能会要高。所以我们推荐使用 Parcelable。那么主要原因:是因为它是对一个对象进行分解,并且分解以后它每一部分内容 intent 都是可以支持的数据类型。

持久化使用 Serializable

那么我们的 Serializable 呢?
它更趋向于使用一种二进制的方式进行一个序列化的动作。那么 Serializable 它在序列化的时候会产生大量的临时变量,那么从这个中间呢,它会引起频繁 GC 的操作。

所以我们在内存中,比方说我们从 activity a 传一个对象到 activity b 的过程中。那么这个对象传输过程中,如果你去使用 Serializable,你会发现:会有很多临时变量产生。那么这样的话,它的性能相对就会较低一些。所以我们会考虑,只要是在程序中进行对象的传输,需要序列化的地方,我们都使用Parcelable, 那么这是在安卓这一块的。

好,那么如果说我们在持久化时,那么在持久化的过程中呢?
Serializable 它的持久化占用的存储空间,会比 Parcelable 要小一些,那么它是直接转换成我们的二进制的方式
那么在反序列化的过程中,我们的 Serializable 它也不会因为对象的增减字段,而造成这种反序列化的失败。

总结

所以我们一般来说在持久化对象的时候,会建议大家使用是Serializable。那么并且它存在我们的文件中,那么这个占用的磁盘空间也会更小一些。虽然说它的性能没有我们的 Parcelable 那么高。

所以 Parcelable 这种序列化方式主要用在内存使用情况,而我们的 Serializable 呢主要用在持久化这种情况。

Serializable 它在序列化的时候会产生大量的临时变量,可能会引起频繁 GC 的操作,消耗内存,性能相对就会较低一些。所以内存中使用Parcelable

Serializable 它的持久化占用的存储空间,会比 Parcelable 要小一些,它是直接转换成我们的二进制的方式。
那么在反序列化的过程中,我们的 Serializable 它也不会因为对象的增减字段,而造成这种反序列化的失败。

这篇关于Android必备回顾:5、谈谈Serializable 接口和Parcelable 接口的区别?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292552

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL