Java-序列化

序列化:将数据结构或者对象转换成二进制串的过程。

反序列化:将序列化生成的二进制串转换成数据结构或者对象的过程

应用:一般我们在网络传输或者本地存储对象或者数据结构时,我们需要序列化操作。然后在我们接受数据或者需要使用存储的对象(还原操作)时,反序列化。

常用的序列化和反序列化协议:

XML&SOAP: 是一种被广泛应用的,基于 XML 为序列化和反序列化协议的结构化消息传递协议

JSON(JavaScript Object Notation):读写快、简单、轻量级、跨平台好

Protobuf:是Google公司开发的一种跨语言和平台的序列化数据结构的方式,与XML和JSON格式相比,protobuf更小、更快、更便捷。

Java提供:

Serializable接口(持久性):实现该接口即可。但是开销比较大,因为在序列化过程中使用了反射机制,会产生许多临时变量,会导致频繁GC,但持久化和网络传输实现较为简单。(IO流形式读写)

Parcelable接口(跨进程 android专有):实现该接口并要实现几个主要的序列化反序列化方法。数据以Binder作为信息载体,内存开销较小,但持久化和网络传输实现较为复杂。(它是基于内存的,在内存中直接进行读写,由于内存读写速度高于硬盘,因此Android中的跨进程对象的传递一般使用Parcelable)

Serializable和F比较:虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)

序列化的方案有很多我们考虑方案主要从:通用性(平台之前的通用差别)、可读性(是否有限制)、兼容拓展性(新老兼容拓展方面)、安全性(传输安全方面)、性能(序列化和反序列化的时间和空间成本)等方面考虑

Intent 中的 Bundle 是使用 Binder 机制进行数据传送的。能使用的 Binder 的缓冲区是有大小限制的(有些手机是 2 M),而一个进程默认有 16 个 Binder 线程,所以一个线程能占用的缓冲区就更小了( 有人以前做过测试,大约一个线程可以占用 128 KB)。所以当你看到 The Bindertransaction failed because it was too large 这类 TransactionTooLargeException 异常时,你应该知道怎么解决了


Serializable接口是JAVA提供的一个序列化方法,相对于Parcelable接口的优点是使用起来非常简单,不用做额外的操作,直接实现即可。

Parcelable接口需要自己实现相应的方法,也正因为这样所以他的效率比Serializable接口要高。

    @Override //这个方法用于创建位掩码通常直接返回0;

    public int describeContents() { 

        return 0; 

    } 

    @Override //这个方法用于将数据写入成一个Parcel对象

    public void writeToParcel(Parcel dest, int flags) { 

        dest.writeInt(id);

        dest.writeString(name);

    }


完整

你可能感兴趣的:(Java-序列化)