美文网首页Android开发移动开发
8. Parcelable和Serializable

8. Parcelable和Serializable

作者: gadfly_only | 来源:发表于2016-08-03 16:55 被阅读156次

    面试题:两个Activity之间如何传递参数?

    除了传递基本类型外,传递自定义的对象需要实现Parcelable或者Serializable接口。

    区别

    两种都是用于支持序列化、反序列化话操作。

    1. 两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。
    2. Serializalbe会使用反射,序列化和反序列化过程需要大量I/O操作,Parcelable自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在Native内存中,效率要快很多。
      Pacelable 和 Serializable 序列化的作用是不同的,Pacelable 是为了“传递”,而 Serializable 是为了“储存”。另外 Serializable 之所以慢,是由于为了读取对象中的成员变量而使用的大量的反射,而 Pacelable 的读写都是自己实现的。还有 Serializable 也是可以自己设置不想要序列化的属性的,只需要在该变量前加一个 transient 关键字(static 标记的属性也是不能序列化的,但是 static final 的可以)。

    效率及选择

    Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化.

    Parcelable和Parcle这两者之间的关系?

    Parcelable 接口定义在封送/解封送过程中混合和分解对象的契约。Parcelable接口的底层是Parcel容器对象。
    Parcel类是一种最快的序列化/反序列化机制,专为Android中的进程间通信而设计。该类提供了一些方法来将成员容纳到容器中,以及从容器展开成员。

    在两个Activity之前传递对象还要注意什么呢?

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

    binder不是用来跨进程通信的吗?为什么activity间传递bundle要使用binder?

    很多Activity并不是在一个进程中,比如你从自己的应用通过Intent打开一个发Email的Activity,你要往这样Activity传一些诸如收件人、主题等信息吧。这样一想Intent的传递肯定就是要跨进程的了.

    相关文章

      网友评论

        本文标题:8. Parcelable和Serializable

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