您的位置:首页 > 其它

序列化(Serializable和Parcelable接口)详解

2017-11-20 19:16 197 查看
1.什么是序列化?

就是一种处理对象流的机制。所谓对象流就是将对象的内容进行流化,我们可以对流化后的对象进行读写操作。也可以将流化后的对象传输于网络之间。

2.序列化的实现:

将需要被序列化的类实现Serializalbe,该接口没有需要实现的方案,只是为了标识该对象是可被序列化的,然后使用一个输出流来构造一个ObjectOutputStream(对象流)对象,使用对象流的对象的writeObject(),方法将参数为obj的对象写出,要恢复的话则用输入流,

如果在序列化的过程中,有些数据字段不是我们想将其序列化的,对于此类字段我们只需要定义时加上transient关键字即可,关于transient字段序列化机制会跳过不会将其写入文件,当然也不可恢复,

但是有时候我们想某一字段序列化,但是在sdk中的定义却是不可序列化类型,这样我们必须把他标注为transient,

序列化机制为包含这种特殊问题的类提供如下的方法:

private void readObject(ObjectInputStream in) throws

IOException, ClassNotFoundException;

private void writeObject(ObjectOutputStream out) throws

IOException;

(注:这些方法定义时必须是私有的,因为不需要你显示调用,序列化机制会自动调用的)

所以简单的说:

java序列化是指把java对象转换为字节序列化的过程,而java反序列化是指把字节序列恢复为java

对象过程。

3.为什么需要序列化和反序列化:

当两个进程之间需要远程通讯时,可以相互发送各种类型的数据,而这些数据都会以二进制序列的形式在网络上传送,通过java序列化与反序列化实现两个java进程通信,

4.如何做到?

1)发送方需要把这个java对象转换为字节序列,然后在网上传送。

2)接收方需要从字节序列中恢复java对象。

5.java序列化的好处

1)数据的持久性。(通过序列化永久的保存到硬盘上)

2)实现远程通讯,(在网上传送对象的字节序列)

6.Serializable和Parcelable接口可以完成对象的序列化过程。当我们需要Intent和Binder传输数据时就

需要使用Serializable和Pracelable,还有时我们需要把对象的持久化到储存设备上或者通过网络传输给其他客户端。

Serializalbe接口

serializable是java所提供的一个序列化接口,它是一个空接口,为对提供标准的序列化和反序列化操作,

如何进行对象的序列化和反序列化操作:

只需要采用ObjectOutputStream和ObjectInoutStream即可轻松实现,



serialVersionUID(序列化时声明的一个长字符串)





它的详细机制是:序列化的时候系统会把当前类的serialVersionUID写入序列化文件中,当反序列化的时候系统会去检测文件中的serialVersionUID,看他是否和当前类的一致,如果一致,说明序列化类的版本和当前类的版本是相同的,这个时候成功反序列化,否则说明当前类和序列化的类相比发生某些变换,这个时候无法正常反序列化,会报错:



Parcelable接口

Parcelable也是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和

Binder传递,典型案例:



Parcel内部包装了可序列化数据,也可以在Binder中自由传输,在序列化过程中需要实现的功能有序列化,反序列化和内容描述:

序列化功能由writeToPacel来完成,最终是通过Parcel中的一系列write方法来完成的,

反序列化是由CREATOR来完成,其内部标明如何创建序列化对象和数组,并通过Parcel的一系列read方法来完成反序列化过程,

内容描述功能由describeContents方法来完成,几乎所有情况下这个方法都返回0,

当对象中存在文件描述符时,返回1.



Parcelable与serializable都可以在Intent间传递数据,该如何选取?

Serializable是java中的序列化接口,并且使用起来简单,但是开销很大,序列化和反序列化过程需要

大量的I/O操作,而Pracelable是android中的序列化,更适合在android平台上,缺点是使用起来麻烦,但是它的效率高,这是android推荐的序列化方式,

通过Parcelable将对象序列化到存储设备中或者将对象序列化后通过网络传输也都是可以的,但是过程稍微复杂,因此在这两种情况下建议大家使用Serializable
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: