Android Parcelable 嵌套readParcelable
来源:互联网 发布:js写插件 编辑:程序博客网 时间:2024/06/05 06:41
转载地址: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);
版权声明:本文为博主原创文章,未经博主允许不得转载。
0 0