Android-Parcelable理解与使用(对象序列化)
2013-12-03 00:29
288 查看
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 传递对象 Android序列化对象主要有两种方法: 1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的; 2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC), 除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。怎么实现Parcelable接口?从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法: 1.describeContents方法。内容接口描述,默认返回0就可以; 2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下: writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc 3.静态的Parcelable.Creator接口,本接口有两个方法: createFromParcel(Parcel in) 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。 newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。Parcelable的定义: 下面我们看下parcelable的源码:
内容描述接口,没什么作用
publicint describeContents();
写入接口函数,用来打包
publicvoid 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 接口。
Parcelable和Serializable的区别:
android自定义对象可序列化有两个选择一个是Serializable和Parcelable
一、对象为什么需要序列化
1.永久性保存对象,保存对象的字节序列到本地文件。
2.通过序列化对象在网络中传递对象。
3.通过序列化对象在进程间传递对象。
二、当对象需要被序列化时如何选择所使用的接口
1.在使用内存的时候Parcelable比Serializable的性能高。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
比如:frameworks层服务端与hardware客户端的Binder通信
reply->writeInt32(getCardReaderSize());
int mid = data.readInt32();
用来存放parcel数据的是内存(RAM),而不是永远介质(Nand等)。 parcelable定义了把数据写入parcel和从parcel读出数据的接口,一个类的实例,如果需要封装到消息中去,就必须实现这一接口,如果实现了这个接口,该类的实例就是可以“被打包”。Parcelable 传递对象 Android序列化对象主要有两种方法: 1.实现Serializable接口,实现Serializable接口是JavaSE本身就支持的; 2.实现Parcelable接口,Parcelable是Android特有的功能,效率比实现Serializable接口高,像用于Intent数据传递也都支持,而且还可以用在进程间通信(IPC), 除了基本类型外,只有实现了Parcelable接口的类才能被放入Parcel中。怎么实现Parcelable接口?从parcelable接口定义中,我们可以看到,实现parcelable接口,需要我们实现下面几个方法: 1.describeContents方法。内容接口描述,默认返回0就可以; 2.writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.即打包需要传递的数据到Parcel容器保存,以便从parcel容器获取数据,该方法声明如下: writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc 3.静态的Parcelable.Creator接口,本接口有两个方法: createFromParcel(Parcel in) 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。 newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。Parcelable的定义: 下面我们看下parcelable的源码:
内容描述接口,没什么作用
publicint describeContents();
写入接口函数,用来打包
publicvoid 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 接口。
01 | package com.zlc.provider; |
02 |
03 | import android.os.Parcel; |
04 | import android.os.Parcelable; |
05 |
06 | public class Students implements Parcelable{ |
07 | private int stu_id; |
08 | private String stu_name; |
09 | 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 StudentscreateFromParcel(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 | } |
android自定义对象可序列化有两个选择一个是Serializable和Parcelable
一、对象为什么需要序列化
1.永久性保存对象,保存对象的字节序列到本地文件。
2.通过序列化对象在网络中传递对象。
3.通过序列化对象在进程间传递对象。
二、当对象需要被序列化时如何选择所使用的接口
1.在使用内存的时候Parcelable比Serializable的性能高。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC(内存回收)。
3.Parcelable不能使用在将对象存储在磁盘上这种情况,因为在外界的变化下Parcelable不能很好的保证数据的持续性。
相关文章推荐
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android-Parcelable理解与使用(对象序列化)
- Android Parcelable理解与使用(对象序列化)
- Android Parcelable理解与使用(对象序列化)
- Android 使用Parcelable序列化对象
- Android 序列化对象Parcelable 的使用
- Android 使用Parcelable序列化对象
- Android中使用Parcelable实现对象的序列化
- Android 使用Parcelable序列化对象
- Android 使用Parcelable序列化对象
- Android 使用Parcelable序列化对象
- Android 使用Parcelable序列化对象
- Android 使用Parcelable序列化对象
- Android中使用Parcelable序列化对象