• Serializable 和Parcelable的区别


     Serializable和Parcelable接口可以完成对象的序列化的过程,当我们需要通过Intent和Binder传输数据时就需要使用Parcelable或者Serializable,有时候我们还需要把对象持久化到存储设备上或者通过网络传输给其他客户端,这个时候也需要使用Seriazable来完成对象的持久化.

    Serializable简介

    Serializable 是Java所提供的一个序列化接口,它是一个空接口,为对象提供标准的序列化和反序列化操作。使用Serializable来实现序列化相当简单,只需要类在声明中指定一个类似下面的标示即可实现默认的序列化过程。

    Parcelable接口

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

    • 1、序列化功能由writeToParcel来完成,最终是通过Parcel中的一些列write方法来完成的。
    • 2、反序列化是由CREATOR来完成,其内部标明了如何创建序列化对象和数组,并通过Parcel的一些列read方法来完成反序列化过程。
    • 3、内容描述功能由describeContents方法来完成,几乎在所有情况下这个方法都应该返回0,仅当前对象中存在文件描述符时,此方法返回1。
    平台区别
    • Serializable是属于 Java 自带的,表示一个对象可以转换成可存储或者可传输的状态,序列化后的对象可以在网络上进行传输,也可以存储到本地。
    • Parcelable 是属于 Android 专用。不过不同于Serializable,Parcelable实现的原理是将一个完整的对象进行分解。而分解后的每一部分都是Intent所支持的数据类型
    编写上的区别
    • Serializable代码量少,写起来方便
    • Parcelable代码多一些,略复杂
     选择的原则
    • 1、如果是仅仅在内存中使用,比如activity、service之间进行对象的传递,强烈推荐使用Parcelable,因为Parcelable比Serializable性能高很多。因为Serializable在序列化的时候会产生大量的临时变量, 从而引起频繁的GC。
    • 2、如果是持久化操作,推荐Serializable,虽然Serializable效率比较低,但是还是要选择它,因为在外界有变化的情况下,Parcelable不能很好的保存数据的持续性。
    本质的区别
    • 1、Serializable的本质是使用了反射,序列化的过程比较慢,这种机制在序列化的时候会创建很多临时的对象,比引起频繁的GC、
    • 2、Parcelable方式的本质是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的类型,这样就实现了传递对象的功能了。

  • 相关阅读:
    【gmoj】旅行
    【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
    thinkphp withJoin 模式下field 无效
    LeetCode:2603. 收集树中金币 详解(2023.9.21 C++)
    Java面试之JVM篇(offer 拿来吧你)
    python爬虫1
    pybind11-c++封装python可用的包
    Python: requirements.txt简介
    .Net 5.0快速上手 Redis
    没想到这些软件也可以做到发票识别
  • 原文地址:https://blog.csdn.net/nuonuonuonuonuo/article/details/133922335