• Android-Parcelable


    Parcelable和Serializable的区别:

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

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

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

      返回0;
        写入接口函数,用来打包
        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. package com.zlc.provider;  
    2.   
    3. import android.os.Parcel;  
    4. import android.os.Parcelable;  
    5.   
    6. public class Students implements Parcelable{  
    7.     private int stu_id;  
    8.     private String stu_name;  
    9.     public Students(Parcel source){  
    10.         stu_id = source.readInt();  
    11.         stu_name = source.readString();  
    12.     }  
    13.     public int getStu_id() {  
    14.         return stu_id;  
    15.     }  
    16.     public void setStu_id(int stu_id) {  
    17.         this.stu_id = stu_id;  
    18.     }  
    19.     public String getStu_name() {  
    20.         return stu_name;  
    21.     }  
    22.     public void setStu_name(String stu_name) {  
    23.         this.stu_name = stu_name;  
    24.     }  
    25.     @Override  
    26.     public int describeContents() {  
    27.         // TODO Auto-generated method stub  
    28.         return 0;  
    29.     }  
    30.     @Override  
    31.     public void writeToParcel(Parcel dest, int flags) {  
    32.         // TODO Auto-generated method stub  
    33.         dest.writeInt(stu_id);  
    34.         dest.writeString(stu_name);  
    35.     }  
    36.     //Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel.   
    37.     public final static Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {  
    38.   
    39.         @Override  
    40.         public Students createFromParcel(Parcel source) {  
    41.             // TODO Auto-generated method stub  
    42.             return new Students(source);  
    43.         }  
    44.   
    45.         @Override  
    46.         public Students[] newArray(int size) {  
    47.             // TODO Auto-generated method stub  
    48.             return new Students[size];  
    49.         }  
    50.     };  
    51. }  
  • 相关阅读:
    es6-compact-table 名词备忘
    JS 防抖和节流函数
    为什么 JS 对象内部属性遍历的顺序乱了
    JS 发送 HTTP 请求方法封装
    JS 一些位操作的妙用
    JS 格式化时间
    linux ssh连接
    c# checked 和 unchecked
    c# mvc action 跳转方式
    IIS 动态与静态压缩
  • 原文地址:https://www.cnblogs.com/yiweiaimeng/p/5251445.html
Copyright © 2020-2023  润新知