zoukankan      html  css  js  c++  java
  • Serializable和Parcelable之序列化

    序列化,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。

     一.Serializable和Parcelable介绍

     Android中Intent如果要传递类对象,可以通过两种方式实现。
      方式一:Serializable,要传递的类实现Serializable接口传递对象,
      方式二:Parcelable,要传递的类实现Parcelable接口传递对象。
      
     Serializable(Java自带):
      Serializable是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。只需要实现Serializable接口就可以,是由系统来完成序列化和反序列化操作。
     Parcelable(android 专用):
      除了Serializable之外,使用Parcelable也可以实现相同的效果,
      不过不同于将对象进行序列化,Parcelable方式的实现原理是将一个完整的对象进行分解,
      而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了。  

     二.Serializable和Parcelable对比 

     1.在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
     2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
     3.Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)
     4.Parcelable 不仅仅需要声明,还需要实现内部的相应方法.writeToParcel;重写describeContents方法,默认值为0;Public static final Parcelable.Creator<T>CREATOR = new CREATOR<T>(){...}
     5.Parcelable是以Ibinder作为信息载体的.在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable,既然是内存方面比价有优势,那么自然就要优先选择.
     6.在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上. 

     三.序列化 运用场景

     注意:不想对部分关键字进行序列化,可以使用transient关键字来修饰以及static修饰.
     1.永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中
     2.通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
     3.将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
     4.Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
     5.序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
     6.在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了. 

     四.总结:

      Java应用程序中有Serializable来实现序列化操作,Android中有Parcelable来实现序列化操作,相关的性能也作出了比较,因此在Android中除了对数据持久化的时候需要使用到Serializable来实现序列化操作,其他的时候我们仍然需要使用Parcelable来实现序列化操作,因为在Android中效率并不是最重要的,而是内存,通过比较Parcelable在效率和内存上都要优秀与Serializable.
     
     
     附上Parcelable.java源码 主要describeContents(),writeToParcel(Parcel dest, @WriteFlags int flags),interface Creator<T>{}
        public interface Parcelable {
        
            /**
             * Describe the kinds of special objects contained in this Parcelable
             * instance's marshaled representation. For example, if the object will
             * include a file descriptor in the output of {@link #writeToParcel(Parcel, int)},
             * the return value of this method must include the
             * {@link #CONTENTS_FILE_DESCRIPTOR} bit.
             *  
             * @return a bitmask indicating the set of special object types marshaled
             * by this Parcelable object instance.
             */
            public @ContentsFlags int describeContents();
            
            /**
             * Flatten this object in to a Parcel.
             * 
             * @param dest The Parcel in which the object should be written.
             * @param flags Additional flags about how the object should be written.
             * May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
             */
            public void writeToParcel(Parcel dest, @WriteFlags int flags);
            
            /**
             * Interface that must be implemented and provided as a public CREATOR
             * field that generates instances of your Parcelable class from a Parcel.
             */
            public interface Creator<T> {
                /**
                 * Create a new instance of the Parcelable class, instantiating it
                 * from the given Parcel whose data had previously been written by
                 * {@link Parcelable#writeToParcel Parcelable.writeToParcel()}.
                 * 
                 * @param source The Parcel to read the object's data from.
                 * @return Returns a new instance of the Parcelable class.
                 */
                public T createFromParcel(Parcel source);
                
                /**
                 * Create a new array of the Parcelable class.
                 * 
                 * @param size Size of the array.
                 * @return Returns an array of the Parcelable class, with every entry
                 * initialized to null.
                 */
                public T[] newArray(int size);
            }
        
        
        }

    [1] 序列化Serializable和Parcelable的理解和区别 https://blog.csdn.net/Double2hao/article/details/70145747

    [2] Android中Serializable和Parcelable序列化对象详解 https://www.cnblogs.com/yezhennan/p/5527506.html

  • 相关阅读:
    php之static静态变量详解
    设计模式【代理模式】
    小牟Andorid下面MD5具体实现的思路总结
    ubuntu14.04安装MySQL
    Android手机定位技术的发展
    我不同意你,这是您的支持
    我要遵守11文章数据库设计指南
    quick-cocos2d-x游戏开发【3】——display.newSprite创建向导
    第二章 自己的框架WMTS服务,下载数据集成的文章1
    JSTL实现int数据的类型的长度
  • 原文地址:https://www.cnblogs.com/bugzone/p/Serializable_Parcelable.html
Copyright © 2011-2022 走看看