你的位置:首页 > 操作系统

[操作系统]Android Parcelable接口的使用/序列化数据


首先,我们要知道Android序列化的方法有两种,一个是实现Serializable,这是JavaSE中就支持的接口,后来google推出了专门针对Android的接口Parcelable(其性能相对Serializable将近快了10倍)

然后我们要知道Android内部传递实例的基本方法:一是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key,Object),它们分别要实现Serializable和Parcelable接口。需要注意的一点是Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。这种情况还是使用Serializable比较好。

我们先看Parcelable接口的定义:

 1 public interface Parcelable  2 { 3   //内容描述接口,基本不用管 4   public int describeContents(); 5   //写入接口函数,打包 6   public void writeToParcel(Parcel dest, int flags); 7   //读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入 8   //为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例 9   public interface Creator<T> 10   {11      public T createFromParcel(Parcel source);12      public T[] newArray(int size);13   }14   public interface ClassLoaderCreator<T> extends Creator<T>15   {16      public T createFromParcel(Parcel source, ClassLoader loader);17    }18 }    

继承该接口后,我们主要是重写writeToParcel()将数据序列化成一个Parcel对象

下面是将一个User类实现了Parcelable的具体源码

 1 package com.catvideo.tv.catvideo.com.catvideo.user; 2  3 import android.os.Parcel; 4 import android.os.Parcelable; 5  6 /** 7  * @author lcc 957109587@qq.com 8  * @version 2016��5��31�� ����12:09:20 9  * @Description 10 */ 11 public class User implements Parcelable { 12   int userId; 13   private String userName; 14   private String passWord; 15   private String email; 16   boolean state; 17  18   public User() { 19  20   } 21  22   public User(String email, String passWord) { 23     this.email = email; 24     this.passWord = passWord; 25   } 26  27   public User(int userId, String userName, String passWord, boolean state) { 28     this.userId = userId; 29     this.userName = userName; 30     this.passWord = passWord; 31     this.state = state; 32   } 33  34   public User(int userId, String userName, String passWord) { 35     this.userId = userId; 36     this.userName = userName; 37     this.passWord = passWord; 38     this.state = false; 39   } 40  41   public int getUserId() { 42     return userId; 43   } 44  45   public void setUserId(int userId) { 46     this.userId = userId; 47   } 48  49   public String getUserName() { 50     return userName; 51   } 52  53   public void setUserName(String userName) { 54     this.userName = userName; 55   } 56  57   public String getPassWord() { 58     return passWord; 59   } 60  61   public void setPassWord(String passWord) { 62     this.passWord = passWord; 63   } 64  65  66   public String getEmail() { 67     return email; 68   } 69  70   public void setEmail(String email) { 71     this.email = email; 72   } 73  74   public boolean isState() { 75     return state; 76   } 77  78   public void setState(boolean state) { 79     this.state = state; 80   } 81  82   @Override 83   public int describeContents() { 84     return 0; 85   } 86  87   @Override 88   public void writeToParcel(Parcel dest, int flags) { 89     boolean[] states = {state}; 90     dest.writeString(userName); 91     dest.writeInt(getUserId()); 92     dest.writeBooleanArray(states); 93   } 94  95 //  public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { 96 ////重写Creator 97 // 98 //    @Override 99 //    public User createFromParcel(Parcel source) {100 //      User user = new User();101 ////      user.userName=source.readString()102 //103 ////      p.map = source.readHashMap(HashMap.class.getClassLoader());104 ////      p.name = source.readString();105 //      return p;106 //    }107 //108 //    @Override109 //    public User[] newArray(int size) {110 //      // TODO Auto-generated method stub111 //      return null;112 //    }113 //  };114 }

 

之后可以这样使用:

intent.putExtra("user", user);

或者使用Bundle.putParcelable(Key,Object)

 

Serializable实现与Parcelabel实现的区别

1)Serializable的实现,只需要implements  Serializable 即可,不需要实现任何方法。这只是给对象打了一个标记,系统会自动将其序列化。

2)Parcelabel的实现,不仅需要implements  Parcelabel,还需要在类中添加一个静态成员变量CREATOR,这个变量需要实现 Parcelable.Creator 接口。