美文网首页
Java-序列化

Java-序列化

作者: 森屿暖茶 | 来源:发表于2021-02-08 16:52 被阅读0次

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

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

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

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

    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-序列化

          本文链接:https://www.haomeiwen.com/subject/juccaktx.html