android序列化(1)Parcelable与Serializable

1.Android中实现序列化有两个选择

  一是实现Serializable接口(是JavaSE本身就支持的),实现Serializable接口非常简单。

  一是实现Parcelable接口(是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC))。

  而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。

  注:Android中Intent传递对象有两种方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object)。当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口。

2.Serializable与Parcelable区别

  • 在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
  • Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
  • Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

3.示例

  一般用ide可自动生成相关代码。

 1 import android.os.Parcel;
 2 import android.os.Parcelable;
 3 
 4 import com.e.weixin.contacts.beans.ContactBean;
 5 
 6 public class MsgBean implements Parcelable{
 7 
 8     public static final int MSB_TYPE_TXT = 0;
 9     public static final int MSB_TYPE_TP = 1;
10     public static final int MSB_TYPE_XSP = 2;
11     public static final int MSB_TYPE_HB = 3;
12     public static final int MSB_TYPE_ZZ = 4;
13     public static final int MSB_TYPE_SC = 5;
14     public static final int MSB_TYPE_WZ = 6;
15     public static final int MSB_TYPE_SPLT = 7;
16     public static final int MSB_TYPE_MP = 8;
17     public static final int MSB_TYPE_YY = 9;
18 
19 
20     ContactBean contact;
21     public int type ;
22     public String title;
23     public String content;
24     public int icon;
25     public int movie_res;
26 
27 
28     //下面代码都是as自动生成
29 
30     protected MsgBean(Parcel in) {
31         type = in.readInt();
32         title = in.readString();
33         content = in.readString();
34         icon = in.readInt();
35         movie_res = in.readInt();
36     }
37 
38     public static final Creator<MsgBean> CREATOR = new Creator<MsgBean>() {
39         @Override
40         public MsgBean createFromParcel(Parcel in) {
41             return new MsgBean(in);
42         }
43 
44         @Override
45         public MsgBean[] newArray(int size) {
46             return new MsgBean[size];
47         }
48     };
49 
50     @Override
51     public int describeContents() {
52         return 0;
53     }
54 
55     @Override
56     public void writeToParcel(Parcel dest, int flags) {
57         dest.writeInt(type);
58         dest.writeString(title);
59         dest.writeString(content);
60         dest.writeInt(icon);
61         dest.writeInt(movie_res);
62     }
63 }

 

posted @ 2016-07-08 22:58  f9q  阅读(193)  评论(0编辑  收藏  举报