转载地址:http://blog.csdn.net/wangbole/article/details/42494179
对于Android的自定义对象进行序列化,一般会选择Parcelable,或者Serializable。
在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);
版权声明:本文为博主原创文章,未经博主允许不得转载。