Android-序列化,Parcelable,Serializable

来源:互联网 发布:mac能玩ff14 编辑:程序博客网 时间:2024/05/15 04:26

序列化可以将一个对象的状态写入到byte流中,并且可以从其他地方将这个byte流重新构造成原对象。这样让我们可以通过网络传递对象,可以将对象固化,写入数据库。

在Android中Intent可以传递序列化对象。

bundle.putSerializable("objectA", objA);bundle.putParcelable("objectB", objB);

在Android中有两种序列化方式

public class ObjectB implements Parcelable

public class ObjectA implements Serializable

Android推荐使用Parcelable:

在使用内存时,Parcelable的性能更高。使用Serializable时,会产生大量的临时变量,频繁的引起系统GC。但是,如果需要将对象存储在磁盘上的时候,需要使用Serializable,因为Parcelable不能很好的保持数据的持续性。


在使用Parcelable时需要注意:

写入的顺序和读取的顺序要一致,boolean类型要做处理,这行代码中的static final一个不能少CREATOR一定要大写。

public static final Parcelable.Creator<T> CREATOR

下面是一个Parcelable的例子:

package com.sunrui.testb;import android.os.Parcel;import android.os.Parcelable;public class ObjectB implements Parcelable {private String name;private int age;private boolean flag;public ObjectB() {}// 读取的顺序要和写入的顺序保持一致public ObjectB(Parcel source) {name = source.readString();age = source.readInt();int i = source.readInt();if (i == 1) {flag = true;} else if (i == 0) {flag = false;}}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}@Overridepublic int describeContents() {return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);dest.writeInt(age);// boolean类型需要特殊处理if (flag) {dest.writeInt(1);} else {dest.writeInt(0);}}public static final Parcelable.Creator<ObjectB> CREATOR = new Creator<ObjectB>() {@Overridepublic ObjectB createFromParcel(Parcel source) {return new ObjectB(source);}@Overridepublic ObjectB[] newArray(int size) {return new ObjectB[size];}};@Overridepublic String toString() {return "ObjectB [name=" + name + ", age=" + age + ", flag=" + flag+ "]";}}



0 0
原创粉丝点击