Android中的序列化:Parcelable和Serializable
     
  
       
      
      
      
    
    
      
          
        概述 
序列化:将一个对象转换成可存储或可传输的状态。
 
Parcelable和Serializable的区别 作用 
Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。
Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
 
性能比较 
在内存的使用中,Parcelable的性能方面要强于Serializable; 
Serializable序列化操作的时候会产生大量的临时变量(原因是使用了反射机制),从而导致GC的频繁调用,因而性能比Parcelable差; 
Parcelable是以IBinder作为信息载体的。在内存上的开销比较小,因此内存直接进行数据传递的时候,Android推荐使用Parcelable; 
在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过IO流的形式将数据写入到硬盘上。 
 
选择 
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如Activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为Android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。
 
Serializable的使用 
对于Serializable的使用,类只需要实现Serializable接口。
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public  class  User  implements  Serializable                private  static  final  long  serialVersionUID = 123456789L ;          private  String uid;     private  String userName;     private  int  age; } 
Parcelable的使用 
Parcelable的使用,需要实现writeToParcel、describeContents函数以及静态的CREATOR变量。
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public  class  User  implements  Parcelable      private  String uid;     private  String userName;     private  int  age;     @Override      public  int  describeContents ()           return  0 ;     }     @Override      public  void  writeToParcel (Parcel dest, int  flags)           dest.writeString(this .uid);         dest.writeString(this .userName);         dest.writeInt(this .age);     }     public  User ()       }     protected  User (Parcel in)           this .uid = in.readString();         this .userName = in.readString();         this .age = in.readInt();     }     public  static  final  Parcelable.Creator<User> CREATOR = new  Parcelable.Creator<User>() {         @Override          public  User createFromParcel (Parcel source)               return  new  User(source);         }         @Override          public  User[] newArray(int  size) {             return  new  User[size];         }     }; } 
参考链接 
Parcelable和Serializable的作用、效率、区别及选择 Android系统中Parcelable和Serializable的区别 序列化Serializable和Parcelable的理解和区别 Android中Serializable和Parcelable序列化对象详解 Serializable Parcelable java类中serialversionuid 作用 是什么?