Android-Parcelable理解与使用(对象序列化)

parcel定义介绍: 

   android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器,封装后的数据可以通过Intent或IPC传递,除了基本类型外,只有实现了Parcelable接口的类才能放入parcel中。

    parcel一般都用在Binder通信,通过read和write方法进行客户端与服务端的数据传递(通信)。
        比如:frameworks层服务端与hardware客户端的Binder通信
                reply->writeInt32(getCardReaderSize());
                int mid = data.readInt32();
    用来存放parcel数据的是内存(RAM),而不是永远介质(Nand等)。

    parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。

Parcelable的定义:

    下面我们看下parcelable的源码:
    
    内容描述接口,没什么作用
    
public int describeContents();
    写入接口函数,用来打包
    
public void writeToParcel(Parcel dest, int flags);
    读取接口,目的是从parcel中构造一个实现了parcelable的类的实例对象,因为实现类这里是不可知的,所以需要用到模板的方法,继承类通过模板参数传入。
    为了能够实现模板参数的传入,定义了creator嵌入接口,内涵两个接入函数分别是单个和多个继承类实例。
    public interface Creator<T> {
         public T createFromParcel(Parcel source);
         public T[] newArray(int size);
    }
    还有一个子接口继承Creator,子接口只提供了一个函数,返回单个继承类实例
    public interface ClassLoaderCreator<T> extends Creator<T> 

Parcelable的实现使用:  

    Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.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
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.zlc.provider;
  import android.os.Parcel; import android.os.Parcelable;
  public class Students implements Parcelable{
     private int stu_id;
     private String stu_name;
     public Students(Parcel source){
         stu_id = source.readInt();
         stu_name = source.readString();
     }
     public int getStu_id() {
         return stu_id;
     }
     public void setStu_id( int stu_id) {
         this .stu_id = stu_id;
     }
     public String getStu_name() {
         return stu_name;
     }
     public void setStu_name(String stu_name) {
         this .stu_name = stu_name;
     }
     @Override
     public int describeContents() {
         // TODO Auto-generated method stub         return 0 ;
     }
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         // TODO Auto-generated method stub         dest.writeInt(stu_id);
         dest.writeString(stu_name);
     }
     //Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel.      public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {
  
         @Override
         public Students createFromParcel(Parcel source) {
             // TODO Auto-generated method stub             return new Students(source);
         }
  
         @Override
         public Students[] newArray( int size) {
             // TODO Auto-generated method stub             return new Students[size];
         }
     };
}

Parcelable和Serializable的区别:


    android自定义对象可序列化有两个选择一个是Serializable和Parcelable

    一、对象为什么需要序列化
        1.永久性保存对象,保存对象的字节序列到本地文件。
        2.通过序列化对象在网络中传递对象。
        3.通过序列化对象在进程间传递对象。

    二、当对象需要被序列化时如何选择所使用的接口
        1.在使用内存的时候Parcelable比Serializable的性能高。
        2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
        3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值