Android中的Parcel机制和Serialize机制

来源:互联网 发布:mac 安装twisted 编辑:程序博客网 时间:2024/04/29 19:06
        实现了Bundle传递对象, 使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parcel机制,即,Android实现的轻量级的高效的对象序列化和反序列化机制。
      JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流当中,在需要时重新生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
    Android中的新的序列化机制,在Android系统中,定位为针对内存受限的设备,因此对性能要求更高,另外系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。在这样的环境下,Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
        Android中序列化有以下几个特征:
        1. 整个读写全是在内存中进行,所以效率比JAVA序列化中使用外部存储器会高很多;
        2. 读写时是4字节对齐的
        3. 如果预分配的空间不够时,会一次多分配50%;
        4. 对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()和unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用重新new一个新对象。

代码:
activity代码:
 Intent mIntent =newIntent(this,ParcelableDemo.class);   
        Bundle mBundle =newBundle();   
        mBundle.putParcelable(PAR_KEY, mPolice);   
        mIntent.putExtras(mBundle);   

实体类:
public class Police implements Parcelable {
       
    private String name;
    private int workTime;
   
    public String getName() {
        returnname;
    }
   
    public void setName(String name) {
        this.name = name;
    }
   
    public int getWorkTime() {
        returnworkTime;
    }
   
    public void setWorkTime(int workTime) {
        this.workTime = workTime;
    }
       
    public static final Parcelable.Creator<Police> CREATOR =newCreator<Police>() {
   
        @Override
        public Police createFromParcel(Parcel source) {
            Police police =newPolice();
            police.name = source.readString();
            police.workTime = source.readInt();
            returnpolice;
        }
   
        @Override
        public Police[] newArray(int size) {
            returnnewPolice[size];
        }
    };
   
    @Override
    public int describeContents() {
        return0;
    }
   
    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(name);
        parcel.writeInt(workTime);
    }
}
0 0
原创粉丝点击