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传输)