序列化与反序列化

序列化

将数据结构或对象转换成二进制串的过程。主要用于网络传输,数据持久化,一般序列化也称为编码(Encode)。

反序列化

将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。 主要用于从网络,磁盘上读取字节数组还原成原始对象,一般反序列化也称为解码 (Decode)。

几种常见的序列化和反序列化协议

XML&SOAP
XML 是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点, SOAP Simple Object Access protocol)是一种被广泛应用的,基于 XML 为序列化和反序列化协议的结构化消息传递协议。
JSON Javascript Object Notation
JSON 起源于弱类型语言 Javascript , 它的产生来自于一种称之为 "Associative array" 的概念,其本质是就是采用"Attribute value" 的方式来描述对象。实际上在 Javascript PHP 等弱类型语言中,类的描述方式就是 Associative array JSON 协议简单、 解析快的优点,使得它快速成为最广泛使用的序列化协议之一。
Protobuf
Protobuf 具备了优秀的序列化协议的所需的众多典型特征。 标准的 IDL IDL 编译器,这使得其对工程师非常友好, 序列化数据非常简洁,紧凑,与 XML 相比,其序列化之后的数据量约为 1/3 1/10, 解析速度非常快,比对应的 XML 快约 20-100 倍, 提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。

Serializable接口

Serializable是java提供的序列化接口,是一个空接口,仅做标记,标记该类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。

一个实现序列化的类,它的子类也是可序列化的。

serialVersionUID

序列化版本Uid,用来表示不同版本间的兼容性,每个类都有一个serialVersionUID,默认是Hashcode值,为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入 serialVersionUID这个属性,具体数值自己定义。这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则会造成对象的反序列化因为类版本不兼容而失败,报InvalidClassException。

Serializable实现原理

Serializable 的序列化与反序列化分别通过 ObjectOutputStream ObjectInputStream 进行。

ObjectOutputStream.writeObject(),传入需要序列化的对象,调用writeObject0()。

一般会走到这个方法ObjectOutputStream.writeObject0()

ObjectOutputStream.writeOrdinaryObject(),将“普通”(即,不是字符串、类、ObjectStreamClass、数组或枚举常量)可序列化对象的表示形式写入流。

最终写序列化的方法

Parcelable接口

parcelable是Android提供的序列化接口,效率比较高,它是基于内存的,由于内存读写速度高于硬盘,因此Android中的跨进程对象的传递一般使用Parcelable。Parcelable实现原理是Binder,Parcelable会将数据包装成Parcel对象,然后在Binder中传输,也就是夸进程传输数据。

Parcel提供了一套机制,可以将序列化之后的数据写入到一个共享内存中,其他进程通过 Parcel可以从这块共享内存中读出字节流,并反序列化成对象,下图是这个过程的模型。

Parcel可以包含原始数据类型(用各种对应的方法写入,比如writeInt(),writeFloat()等),可以包含 Parcelable对象,它还包含了一个活动的IBinder对象的引用,这个引用导致另一端接收到一个指向这个IBinder的代理IBinder。 Parcelable通过Parcel实现了readwrite的方法,从而实现序列化和反序列化。

image.png

Android中Intent/Bundle的通信原理及大小限制?

Intent 中的 Bundle 是使用 Binder 机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder 线程,所以一个线程能占用的缓冲区就更小了( 有人以前做过测试,大约一个线程可以占用 128 KB)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永琪-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值