JAVA和Android序列化技术详解

您所在的位置:网站首页 java序列化和反序列化两种方式是什么 JAVA和Android序列化技术详解

JAVA和Android序列化技术详解

#JAVA和Android序列化技术详解| 来源: 网络整理| 查看: 265

文章目录 什么是序列化为什么需要序列化序列化的应用场景Serializable序列化Parcelable序列化Json序列化Serializable和Parcelable对比与总结其他

什么是序列化

序列化是Java/Android 提供的一种机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

为什么需要序列化

1.传统java的序列化机制有两个问题:数据量大,传输效率低, 其他语言无法识别。比如Json 序列化虽然可读性强,但是存在占用空间大并且性能低下,是因为有很多结构化的东西,各种符号。 2.对象的序列化就是为了数据传输,在你的代码的里是对象格式,而在传输的时候不可能还保持这对象的样子。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 3.对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 4.对象、文件、数据,有许多不同的格式,很难统一传输和保存。而序列化以后就可以把上述数据转换为字节流,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件。

序列化的应用场景

1.实现分布式对象。 主要应用例如:RMI(即远程调用Remote Method Invocation)要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 2.将内存中的类写入文件或数据库中。 比如:将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。 3.跨进程或者Activity之间数据传输(序列化接口的能在 Intent 中传递,也能在 Binder 中传递)

Serializable序列化

将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

Parcelable序列化

Android的Parcelable的设计初衷是由于Serializable效率过低,消耗大,而Android中数据传递主要是在内存环境中(内存属于Android中的稀有资源),因此Parcelable的出现为了满足数据在内存中低开销而且高效地传递问题。

Parcelable是直接在内存中读写,我们知道内存的读写速度肯定优于硬盘读写速度,所以Parcelable序列化方式性能上要优于Serializable方式很多。所以Android应用程序在内存间数据传输时推荐使用Parcelable,如activity间传输数据和AIDL数据传递。大多数情况下使用Serializable也是没什么问题的,但是针对Android应用程序在内存间数据传输还是建议大家使用Parcelable方式实现序列化,毕竟性能好很多,其实也没多麻烦。 Parcelable也可以在网络中传输,只不过实现和操作过程过于麻烦并且为了防止Android版本不同而导致Parcelable可能不同的情况,因此在序列化到存储设备或者网络传输方面还是尽量选择Serializable接口。

Json序列化

JSON全称JavaScript Object Notation,它是一种轻量级的数据交换格式,Android SDK原生支持JSON格式的解析和序列化,JSON可以说是移动端使用最广泛的数据交换格式。对于JSON的解析,Google还推出了自己的开源库Gson可以很快的实现JSON的解析。

Serializable和Parcelable对比与总结

Serializable与Parcelable之间最大的区别在于存储的媒介不同,Serializable使用I/O读写存储在硬盘上,Parcelable是直接在内存中进行读写。Serializable大量使用反射,Parcelable自己实现封装和解封操作不需要用反射,数据也是存放在Native内存中,效率更高。

其他

静态变量和 transient 关键字标注的字段不参与序列化与反序列化过程。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3