Parcelable与Serializable

简介: 跟大家分享一下Android的序列化

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也可以


目录
相关文章
|
4月前
|
Java API 数据库
Java一分钟之-JPA注解:@Entity, @Table, @Id等
【6月更文挑战第14天】Java Persistence API (JPA) 是Java开发中的ORM框架,通过注解简化数据访问层。本文介绍了三个核心注解:`@Entity`标识实体类,`@Table`自定义表名,`@Id`定义主键。易错点包括忘记添加`@Entity`、未正确设置主键。建议使用`@GeneratedValue`和`@Column`细化主键策略和字段映射。正确理解和应用这些注解能提高开发效率和代码质量。
156 3
|
5月前
|
Dubbo Java 应用服务中间件
Serialized class org.apache.catalina.core.ApplicationPart must implement java.io.Serializable
Serialized class org.apache.catalina.core.ApplicationPart must implement java.io.Serializable
82 0
|
5月前
|
Java
java-基础-Interface、abstract类、Static class 、non static class的区别
【4月更文挑战第5天】Java中的接口、抽象类、静态类和非静态类各具特色:接口仅含抽象方法和常量,用于定义行为规范;抽象类可包含抽象和非抽象方法,提供部分实现,支持多继承;静态内部类不依赖外部类实例,可独立存在,访问外部类的静态成员;非静态内部类持有关联外部类引用,能访问其所有成员。这些机制根据设计需求和场景选择使用。
45 6
|
5月前
|
Java API Spring
spring注解中@RequestParam和@PathVariable的区别
spring注解中@RequestParam和@PathVariable的区别
132 0
|
Java Spring 容器
No qualifying bean of type ‘java.lang.String‘ available: expected at least 1 bean which qualifies
No qualifying bean of type ‘java.lang.String‘ available: expected at least 1 bean which qualifies
917 0
No qualifying bean of type ‘java.lang.String‘ available: expected at least 1 bean which qualifies
Can not set final java.lang.Class field org.apache.ibatis.binding.MapperProxy.mapperInterface to com
Can not set final java.lang.Class field org.apache.ibatis.binding.MapperProxy.mapperInterface to com
131 0
|
XML JSON Java
【Java用法】@RequestParam、@RequestBody、@ResponseBody和@PathVariable的使用与区别
【Java用法】@RequestParam、@RequestBody、@ResponseBody和@PathVariable的使用与区别
117 0
|
Java
Java重写override
Java重写override
77 0
|
Java
Java 权限修饰符(private、protected、public、默认、final、static)
Java 权限修饰符(private、protected、public、默认、final、static)
168 0
|
Java 数据库连接 数据库
util工具类中的方法为什么要用static修饰?
关于static学习的次数真的很多,每次搞得好像似懂非懂,这次就来一次深刻认识
194 0