Android序列化接口Parcelable与Serializable接口对比
作者:小尹编码中... 发布时间:2023-03-24 17:48:59
Parcelable
优点:
google专门为安卓写的序列化接口
性能好,内存开销小,效率高,写起来复杂
缺点:
各个机型可能有差异,Parcelable使用会产生差异
通讯组件之间(AIDL ,INTENT)的数据传递,可以使用Parcelable
写入存储设备推荐使用Serializable
public class MyParcelable implements Parcelable {
* private int mData;//参数
* public int describeContents() {//类描述,一般不管他
* return 0;
* }
* public void writeToParcel(Parcel out, int flags) {//序列化 :out写入参数,要注明参数类型 flag一般默认是0,1代表对象需要返回,不回收
* out.writeInt(mData);
* }
* public static final Parcelable.Creator<MyParcelable> CREATOR//反序列化操作
* = new Parcelable.Creator<MyParcelable>() {
* public MyParcelable createFromParcel(Parcel in) {
* return new MyParcelable(in);
* }
* public MyParcelable[] newArray(int size) {
* return new MyParcelable[size];
* }
* };
* private MyParcelable(Parcel in) {
* mData = in.readInt();
* }
* }
google官方也是很贴心呀,直接把怎么用放在源码的注释里了
Serializable
优点:
java自带的序列化接口
Serializable是一个空接口,使用简单,是一个标识,会给类一个序列化UID
缺点:
因为使用的是反射,使用性能差,内存开销大
package java.io;
// Android-added: Notes about serialVersionUID, using serialization judiciously, JSON.
public interface Serializable {
}
Serializable 是一个空接口,用来标识当前类可以被 ObjectOutputStream序列化,以及被ObjectInputStream反序列化
Parcelable与Serializable的性能比较
在内存的使用中,Parcelable在性能方面要强于Serializable
Serializable在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色
Parcelable是以Ibinder作为信息载体的,在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable
在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上
虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化 (原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
总结:
Java应用程序中有Serializable来实现序列化操作
Android中有Parcelable来实现序列化操作
在Android中除了对数据持久化的时候需要使用到Serializable来实现序列化操作,其他的时候我们仍然需要使用Parcelable来实现序列化操作
在Android中效率并不是最重要的,而是内存, 通过比较Parcelable在效率和内存上强于Serializable
个人小建议:
尽管Parcelable实现起来比较复杂,但是如果我们想要成为一名优秀的Android软件工程师,那么我们就需要勤快一些去实现Parcelable,而不是偷懒与实现Serializable,当然实现Serializable也可以
来源:https://blog.csdn.net/Ai1114/article/details/125246559


猜你喜欢
- 布局文件:res/layout/activity_my.xml[html] <LinearLayout xmlns:and
- 简介有时候会需要在c#特别是WPF环境下调用其他的程序,这类型的程序以命令行为执行环境,这里就说明下如何调用exe并传递参数一般有两种方法一
- 一个完整的http响应包括响应行,若干响应头和响应数据主体三部分构成。如果我们能用响应对象来进行这三部分的处理,就能向客户发送特定的响应数据
- 废话不多说,上代码public String getRelativeTimeSpanStringForIphone(long time,lo
- Android getevent用法实例详解最近在测试设备按键的常用命令,感觉这些命令都有的,但就是不知道怎么查找。翻阅了几篇博
- 主要用的是org.apache.tools.zip.ZipOutputStream 这个zip流,这里以Execl为例子。思路首
- 前几天在“Android绘图之渐隐动画”一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙,我又改进了一下。
- 我就废话不多说了,大家还是直接看代码吧~ public Sprite LoadSourceSprite(string relat
- Spring @Order进行排序直接上代码public class OrderAnnotationTest { &
- 内存分配方式简介在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:在执行函数时,函数内局部变量的存
- 昨天,我试着在屏幕切换时,使View显示在不同的位置,在网上搜索了一些资料,自己做了一段时间,终于完成了功能。由于屏幕切换会调用activi
- Spring Security OAuth2主要配置,注意application.yml最后的配置resource filter顺序配置,不
- 本文实例讲述了Android实现ListView数据动态加载的方法。分享给大家供大家参考,具体如下:list.setOnScrollList
- 上一节我们做好了支付页面的显示,从上一节支
- WPF 实现筛选下拉多选控件框架使用.NET4 至 .NET6;Visual Studio 2022;创建 MultiSelect
- 那些GC的默认值其实GC或者说JVM的参数非常非常的多,有控制内存使用的:有控制JIT的:有控制分代比例的,也有控制GC并发的:当然,大部分
- 批量修改代码如下<update id="UPDATE_HOTEL_REAL_TIME_PRICE" paramet
- Flutter Sizedbox 是一个 布局组件,用来给 child 添加 tight 约束的,也可以用来添加空白。width,heigh
- ①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 1.前面讲解的都是通过直接读取配置文件,进行的实例化ApplicationContextAbstractApplicationContext