Android Parcelable接口的使用/序列化数据

Posted Linccy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 [email protected]
  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 //        @Override
109 //        public User[] newArray(int size) {
110 //            // TODO Auto-generated method stub
111 //            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 接口。

以上是关于Android Parcelable接口的使用/序列化数据的主要内容,如果未能解决你的问题,请参考以下文章

——Parcelable接口的使用(跨进程,Intent传输)

Android中Parcelable接口用法

从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突

Android中Parcelable接口用法

Android中Parcelable接口用法

Android中的Parcelable接口和Serializable用法和区别