import android.os.Parcel;
import android.os.Parcelable;
public class UnionLoginInfo implements Parcelable {
public String mTitle;
public String mMobileSupport;
public String mImage_b;
public String mImage_m;
public String mImage_s;
public String mUrl;
public String mRedirect_key;
public String mRedirect_url;
public UnionLoginInfo() {
super();
}
public UnionLoginInfo(String title, String mobileSupport, String image_b, String image_m, String image_s,
String url, String redirect_key, String redirect_url) {
super();
this.mTitle = title;
this.mMobileSupport = mobileSupport;
this.mImage_b = image_b;
this.mImage_m = image_m;
this.mImage_s = image_s;
this.mUrl = url;
this.mRedirect_key = redirect_key;
this.mRedirect_url = redirect_url;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) { // 复杂数据(类)序列化必须实现的方法
dest.writeString(mTitle);
dest.writeString(mMobileSupport);
dest.writeString(mImage_b);
dest.writeString(mImage_m);
dest.writeString(mImage_s);
dest.writeString(mUrl);
dest.writeString(mRedirect_key);
dest.writeString(mRedirect_url);
}
// 自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法
public static final Parcelable.Creator<UnionLoginInfo> CREATOR = new Parcelable.Creator<UnionLoginInfo>() {
public UnionLoginInfo createFromParcel(Parcel in) {
UnionLoginInfo ret = new UnionLoginInfo();
ret.mTitle = in.readString();
ret.mMobileSupport = in.readString();
ret.mImage_b = in.readString();
ret.mImage_m = in.readString();
ret.mImage_s = in.readString();
ret.mUrl = in.readString();
ret.mRedirect_key = in.readString();
ret.mRedirect_url = in.readString();
return ret;
}
public UnionLoginInfo[] newArray(int size) {
return new UnionLoginInfo[size];
}
};
}
一 序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。
二 至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。
实现:
1 Serializable 的实现,只需要继承 implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。
private int mData;
public int describeContents() {
return 0 ;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator < MyParcelable > CREATOR
= new Parcelable.Creator < MyParcelable > () {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray( int size) {
return new MyParcelable[size];
}
};
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
Parcel 在英文中有两个意思,其一是名词,为包裹,小包的意思; 其二为动词,意为打包,扎包。邮寄快递中的包裹也用的是这个词。Android采用这个词来表示封装消息数据。这个是通过IBinder通信的消息的载体。需要明确的是Parcel用来存放数据的是内存(RAM),而不是永久性介质(Nand等)。
Parcelable,定义了将数据写入Parcel,和从Parcel中读出的接口。一个实体(用类来表示),如果需要封装到消息中去,就必须实现这一接口,实现了这一接口,该实体就成为“可打包的”了。
接口的定义如下:
- public interface 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);
- }
在实现Parcelable的实现中,规定了必须定义一个静态成员, 初始化为嵌入接口的实现类。
- public static Parcel.Creator<DrievedClassName> CREATOR =
- new Parcel.Creator<DrievedClassName>();
下面定义了一个简单类MyMessage, 他需要把自身的数据mdata,打入包中。 同时在消息的接收方需要通过MyMessage实现的Parcelable接口,将MyMessage重新构造出来。
- import android.os.Parcel;
- import android.os.Parcelable;
- public class MyMessage implements Parcelable {
- private int mData;
- public int describeContents() {
- return 0;
- }
- public void writeToParcel(Parcel out, int flags) {
- out.writeInt(mData);
- }
- public static final Parcelable.Creator<MyMessage> CREATOR
- = new Parcelable.Creator<MyMessage>(){
- public MyMessage createFromParcel(Parcel in) {
- return new MyMessage(in);
- }
- public MyMessage[] newArray(int size) {
- return new MyMessage[size];
- }
- };
- private MyMessage(Parcel in) {
- mData = in.readInt();
- }
- public MyMessage(int data) {
- mData = data;
- }
- }