今天就跟大家聊聊有关Parcelable和序列化怎么在Android中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
<强>序列化强>
由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。
<强>反序列化强>
反序列化恰恰是序列化的反向操作,也就是说,把已存在在磁盘或者其他介质中的对象,反序列化(读取)到内存中,以便后续操作,而这个过程就叫做反序列化。
概括性来说序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
<强>实现序列化的必要条件强>
一个对象要实现序列化操作,该类就必须实现了可序列化的接口或者Parcelable接口,其中可序列化的接口是在java中的序列化抽象类,而Parcelable接口则是Android中特有的序列化接口,在某些情况下,Parcelable接口实现的序列化更为高效、关于它们的实现案例我们后续会分析,这里只要清楚知道实现序列化操作时必须实现可序列化的接口或者Parcelable接口之一即可。
<强>序列化的应用情景强>
主要有以下情况(但不限于以下情况)
1)内存中的对象写入到硬盘;
2)用套接字在网络上传送对象,
3)通过RMI(远程方法调用远程方法调用)传输对象,
<强> 1. Parcelable和序列化有什么用,它们有什么差别? 强>
Parcelable和序列化是两个接口,它们的作用是让实现了其中一个接口的类的对象能够被序列化和反序列化。
(1)序列化是java提供的序列化接口,它是一个空的接口,仅标识该类型可序列化的,具体的序列化/反序列化工作由ObjectInputStream readObject ()/ObjectOutputStream (writeObject)完成,这个过程包含大量的I/O操作,使用比较简单,但需要考量性能的影响。使用场景:将对象持久化到存储介质或者通过网络传输。
(2) Parcelable接口是Android平台下的序列化接口,通常跨进程传递的数据都要正确实现这个接口,比如意图,位图等.Parcelable实现起来比可序列化的复杂,但性能较好。使用场景:在内存中实现序列化,例如跨进程传递,若某个字段不需要序列化,在实现writeToParcel方法中忽略此字段即可。
<强> 2。自定义一个类让其实现Parcelable,大致流程是什么?强>
(1)首先实现Parcelable接口,并实现接口中的方法。
/* * ,*返回当前对象的内容描述,如果有文件描述符返回1,否则返回0。 ,*/@Override public int  describeContents (), { ,return 0; } @Override public void  writeToParcel (Parcel 桌子,int 旗帜),{ ,dest.writeInt (userId); ,dest.writeString(用户名); ,dest.writeInt (isMan ?, 1,:, 0); }
(2)接着创建一个Parcelable接口内部的接口类型的创造者的一个成员,内部需要用到一个带一个包裹参数的构造方法。
protected 用户(Parcel 在),{=,,userId  in.readInt ();=,,userName  in.readString ();=,,isMan  in.readByte (), !=, 0; }/* * ,*在aidl中,参数使用,或者inout来修饰时,服务端的onTransact()会调用创造者中方法来反序列化客户端传过来的参数 ,*/public static  final Creator< User>, CREATOR =, new Creator(), { ,@Override ,public User  createFromParcel (Parcel 在),{ return 才能;new 用户(在); ,} ,@Override ,public 用户[],newArray (int 大小),{ return 才能;new 用户(大小); ,} };
(3)如果在aidl文件中使用了或者inout定向标签来修饰参数,还必须实现一个readFromParcel(包裹)方法,这是因为使用这两个定向标签修饰的参数,在服务端onTransact()返回后,客户端会调用readFromParcel()来读取(反序列化)_reply中的数据。该方法与writeToParcel是对应的,实现如下:
public void readFromParcel (Parcel 在),{=,,userId  in.readInt ();=,,userName  in.readString ();=,,isMan  in.readInt (),==, 1, ?, true :,假; }
<强> 3。实现可序列化的接口