Serializable 与Parcelable:都是对Java对象实现序列化,反序列化的一种机制。
序列化:把Java对象转换为字节序列,并且存储到一个存储媒介的过程。
反序列化:与序列化相反,把存储媒介上的字节序列转换成Java对象的过程。
序列化和反序列化中三个关键点:Java对象,字节序列,和存储媒介。
序列和反序列针对的只是Java对象的数据,无关方法。字节序列,例如:"1A165613246546" ,存储媒介,可以为外存,和内存。
Serializable和Parcelable的区别
两者都支持序列化和反序列化。两者最大的区别就是存储媒介不同。
Serializable利用IO读写在硬盘,Parcelable在内存中读写。因此Parcelable在效率上高于Serializable。
选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据;
而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,
所以不推荐使用Parcelable进行数据持久化,在外在环境改变时,Parcelable不能很好的保存数据的持续性。
Serializable 实现
1,implements Serializable;
2,生成ID:private static final long serialVersionUID = 1L;
例如:
public class VideoVo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public String url;
public String title;
}
Parcelable 实现
1,implements Parcelable;
2,重写抽象方法:describeContents(),writeToParcel(Parcel dest, int flags);
3,必须添加一个常量CEATOR(特定),并且实现接口Parcelable.Creator;
例如:
package com.wang.myvideoplayer.entity;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
public class VideoInfo implements Parcelable{
//视频标题
public String title;
//视频路径
public String url;
//视频长度
public String duration;
//视频id
public String id;
//是否被选择
public Boolean isChecked = false;
//构造函数
public VideoInfo() {
// TODO Auto-generated constructor stub
}
//带参的构造函数
public VideoInfo(Parcel in){
Bundle bundle = in.readBundle();
title=bundle.getString("title");
url=bundle.getString("url");
duration=bundle.getString("duration");
id=bundle.getString("id");
isChecked = bundle.getBoolean("isChecked");
}
@Override
public String toString() {
return "title"+title;
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Bundle bundle = new Bundle();
bundle.putString("title", title);
bundle.putString("url", url);
bundle.putString("id", id);
bundle.putString("duration", duration);
bundle.putBoolean("isChecked", isChecked);
dest.writeBundle(bundle);
}
public static final Parcelable.Creator<VideoInfo> CREATOR = new Creator<VideoInfo>() {
@Override
public VideoInfo[] newArray(int size) {
// TODO Auto-generated method stub
return new VideoInfo[size];
}
@Override
public VideoInfo createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return new VideoInfo(source);
}
};
}