日常的开发过程中,我们经常需要通过Intent和Binder传输数据,Object 类型不能直接传递,需要通过序列化。序列化是将对象状态转换为可保持或传输的格式,包括Parcelable和Serializable两种方式。
1.Object序列化
1)使用Serializable方式
public class SerInfo implements Serializable {
private static final long serialVersionUID = 8711368826010013025L;
private String Id;
private String Name;
public SerInfo(String id, String name){
Id = id;
Name = name;
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
2)使用Parcelable方式
public class ParInfo implements Parcelable {
private String Id;;
private String Name;
public ParInfo(){
}
public ParInfo(String id, String name){
Id = id;
Name = name;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getId() {
return Id;
}
public void setId(String id) {
Id = id;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
//该方法将类的数据写入外部提供的Parcel中。
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(Id);
dest.writeString(Name);
}
public static final Parcelable.Creator<ParInfo> CREATOR = new Creator<ParInfo>() {
//实现从source中创建出类的实例的功能
@Override
public ParInfo createFromParcel(Parcel source) {
ParInfo parInfo = new ParInfo();
parInfo.Id = source.readString();
parInfo.Name= source.readString();
return parInfo;
}
//创建一个类型为T,长度为size的数组
@Override
public ParInfo[] newArray(int size) {
return new ParInfo[size];
}
};
}
2.Serializable与Parcelable的区别
Serializable是Java中的序列化接口,使用简单但是开销略大,序列化和反序列化过程需要大量I/O操作。
Parcelable是Android系统中的序列化方式,相比较更适用于Android平台,缺点就是使用起来相对麻烦,优点是效率很高。因此在用于Intent间的数据传递时我们要首选Parcelable。
Parcelable主要用在内存序列化上,通过Parcelable将对象持久化到存储设备中,或者将对象序列化后通过网络传输,该过程稍微复杂,因此建议大家使用Serializable方式进行序列化可能效率会更高。
3.传递List<Object>的方法
ArrayList<SerInfo> listObj = new ArrayList<SerInfo>();
SerInfo serInfo1 = new SerInfo(id1,name1);
SerInfo serInfo2 = new SerInfo(id2, name2);
listObj.add(serInfo1);
listObj.add(serInfo2);
Intent intent = new Intent();
intent.setClass(MainActivity.this, XXX.class);
intent.putExtra("listobj", (Serializable) listObj);
startActivity(intent);
4.接收List<Object>的方法
ArrayList<SerInfo> listObj = (ArrayList<SerInfo>) getIntent().getSerializableExtra("listobj");