对于Android的自定义对象进行序列化,一般会选择Parcelable,或者Serializable。
在Android中,由于在使用内存时,Parcelable类要比Serializable类的性能要高;
并且Serializable在序列化的时候会产生大量的临时变量,从而会引起频繁的GC,因此在Android开发中,会推荐使用Parcelable进行序列化。
在序列化时,碰到Parcelabe类中,嵌套Parcelabe类,会稍微有点不一样。
关键的代码就是读取时,使用**.class.getClassLoader()进行读取;
如:
而对于嵌套的列表,则使用如下代码:
在Android中,由于在使用内存时,Parcelable类要比Serializable类的性能要高;
并且Serializable在序列化的时候会产生大量的临时变量,从而会引起频繁的GC,因此在Android开发中,会推荐使用Parcelable进行序列化。
在序列化时,碰到Parcelabe类中,嵌套Parcelabe类,会稍微有点不一样。
如下:
public class FacialPart implements Parcelable {
private int id;
private float scale = 1.0f;
private float tx;
private float ty;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public float getScale() {
return scale;
}
public void setScale(float scale) {
this.scale = scale;
}
public float getTx() {
return tx;
}
public void setTx(float tx) {
this.tx = tx;
}
public float getTy() {
return ty;
}
public void setTy(float ty) {
this.ty = ty;
}
public FacialPart() {
this(0);
}
public FacialPart(int id) {
this.id = id;
}
@Override
public String toString() {
return "FacialPart[id=" + id + ", scale=" + scale + ", tx=" + tx + ", ty=" + ty + "]";
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeInt(id);
dest.writeFloat(scale);
dest.writeFloat(tx);
dest.writeFloat(ty);
}
public static final Parcelable.Creator<FacialPart> CREATOR = new Parcelable.Creator<FacialPart>() {
@Override
public FacialPart createFromParcel(Parcel in) {
int id = in.readInt();
float s = in.readFloat();
float tx = in.readFloat();
float ty = in.readFloat();
FacialPart part = new FacialPart(id);
part.setScale(s);
part.setTx(tx);
part.setTy(ty);
return part;
}
@Override
public FacialPart[] newArray(int size) {
return new FacialPart[size];
}
};
}
public class DetectedFace implements Parcelable {
private FacialPart facePart;
private FacialPart nosePart;
private FacialPart eyePart;
private FacialPart eyebrowPart;
private FacialPart mouthPart;
private List<FacialPart> parts;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flag) {
dest.writeParcelable(facePart, flag);
dest.writeParcelable(nosePart, flag);
dest.writeParcelable(eyePart, flag);
dest.writeParcelable(eyebrowPart, flag);
dest.writeParcelable(mouthPart, flag);
dest.writeTypedList(parts);
}
public static final Parcelable.Creator<DetectedFace> CREATOR = new Parcelable.Creator<DetectedFace>() {
@Override
public DetectedFace createFromParcel(Parcel in) {
FacialPart facePart = in.readParcelable(FacialPart.class.getClassLoader());
FacialPart nosePart = in.readParcelable(FacialPart.class.getClassLoader());
FacialPart eyePart = in.readParcelable(FacialPart.class.getClassLoader());
FacialPart eyebrowPart = in.readParcelable(FacialPart.class.getClassLoader());
FacialPart mouthPart= in.readParcelable(FacialPart.class.getClassLoader());
List<FacialPart> parts = new ArrayList<FacialPart>();
in.readTypedList(parts, FacialPart.CREATOR);
DetectedFace face = new DetectedFace();
face.facePart = facePart;
face.nosePart = nosePart;
face.eyePart = eyePart;
face.eyebrowPart = eyebrowPart;
face.mouthPart = mouthPart;
face.parts = parts;
return face;
}
@Override
public DetectedFace[] newArray(int size) {
return new DetectedFace[size];
}
};
}
关键的代码就是读取时,使用**.class.getClassLoader()进行读取;
如:
FacialPart facePart = in.readParcelable(FacialPart.class.getClassLoader());
而对于嵌套的列表,则使用如下代码:
List<FacialPart> parts = new ArrayList<FacialPart>();
in.readTypedList(parts, FacialPart.CREATOR);