zoukankan      html  css  js  c++  java
  • Android Parcelable和Serializable的区别,androidparcelable

    本文主要介绍Parcelable和Serializable的作用、效率、区别及选择,关于Serializable的介绍见Java 序列化的高级认识。

    1、作用

    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个 程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程 序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

    从上面的设计上我们就可以看出优劣了。

    2、效率及选择

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

    3、编程实现

    对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。 而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打 包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

    Parcelable的一个实现例子如下

     1 public class MyParcelable implements Parcelable {  
     2      private int mData;  
     3      private String mStr;  
     4   
     5      public int describeContents() {  
     6          return 0;  
     7      }  
     8   
     9      // 写数据进行保存  
    10      public void writeToParcel(Parcel out, int flags) {  
    11          out.writeInt(mData);  
    12          out.writeString(mStr);  
    13      }  
    14   
    15      // 用来创建自定义的Parcelable的对象  
    16      public static final Parcelable.Creator<MyParcelable> CREATOR  
    17              = new Parcelable.Creator<MyParcelable>() {  
    18          public MyParcelable createFromParcel(Parcel in) {  
    19              return new MyParcelable(in);  
    20          }  
    21   
    22          public MyParcelable[] newArray(int size) {  
    23              return new MyParcelable[size];  
    24          }  
    25      };  
    26        
    27      // 读数据进行恢复  
    28      private MyParcelable(Parcel in) {  
    29          mData = in.readInt();  
    30          mStr = in.readString();  
    31      }  
    32  }  

    从上面我们可以看出Parcel的写入和读出顺序是一致的。如果元素是list读出时需要先new一个ArrayList传入,否则会报空指针异常。如下:

    list = new ArrayList<String>();
    in.readStringList(list);

    PS: 在自己使用时,read数据时误将前面int数据当作long读出,结果后面的顺序错乱,报如下异常,当类字段较多时务必保持写入和读取的类型及顺序一致。

    11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel 
    android.os.Parcel@4126ed60: Unmarshalling unknown type code 3014773 at offset 164

    4、高级功能上

    Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义

    其他:

    android.os.BadParcelableException: ClassNotFoundException when unmarshalling

    参考:

    http://developer.android.com/reference/android/os/Parcelable.html

  • 相关阅读:
    c#自动更新+安装程序的制作
    VS2013项目受源代码管理向源代码管理注册此项目时出错
    WinDbg配置和使用基础
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
    PowerDesigner 如何生成数据库更新脚本
    用户故事(User Story)
    Troubleshooting Record and Playback issues in Coded UI Test
    Coded UI
    compare two oracle database schemas
    How to: Use Schema Compare to Compare Different Database Definitions
  • 原文地址:https://www.cnblogs.com/ldq2016/p/5391131.html
Copyright © 2011-2022 走看看