前言
Android开发中难免会遇到对象序列化的场景,比如说将对象从一个Activity通过Intent传到另一个Activity,比如说存储到本地等等。大体的总结一下序列化的知识吧。
Serializable
意为“序列化的”意思
什么是序列化
- 序列化:把对象转换为字节序列的过程
- 反序列化:把字节序列转换为对象的过程
什么时候需要序列化
- 当你想把一个对象通过Intent传递到另一个Activity中
- 当你想把保存了一个详情页的对象缓存到本地文件或数据库中
- 当你想用socket在网络上传送对象的时候
- 。。。
怎样实现序列化
很简单,实现Serializable接口即可,但序列化机制使用了反射去构造序列化对象,性能较慢,创建了大量的临时对象,造成很大的GC
这里有几个基本点需要注意:
- 父类实现了序列化,子类就自动实现了序列化
- 父类没实现序列化,子类需要实现,主要显式的实现Serializable接口,父类中要有无参构造函数
- 序列化只保存对象的属性,不保存方法
- 对象的实例变量引用了其他对象,引用对象也需要序列化
- 关于是否要设置序列化ID
- 序列化不保存静态变量
- transient关键字可以使得字段不被序列化
贴个讲的不错的Serializable链接:Java序列化的高级认识
举两个接近项目实战的例子:
// 1 现在需要将一个论坛详情页的信息缓存到本地
// 将网络请求下来的数据缓存
// 网络请求基类
public class BaseResponseBean implements Serializable{
public String status;
public String errmsg;
}
// 论坛详情Bean, 只需继承基类
public class ForumsDetailBean extends BaseResponseBean {
public String forumsId;
public String forumsName;
public String forumsLogo;
public String forumsType;
public String postCount;
public String postReplyCount;
public String lookCount;
public String collectStatus;
}
// 2 现在做一个发布功能, 我们需要做一个草稿箱, 将这个未写完的内容缓存到本地
// 我用一个对象来保存草稿箱数据
public class PublishData implements Serializable{
public String id;
public String title;
public String content;
// 图片视频列表
public List<ImageVideoItem> list;
}
// 引用了ImageVideoItem的实例, 所以ImageVideoItem也得实现Serializable接口
public class ImageVideoItem implements Serializable{
public String picUrl;
public String picCompressUrl;
public String videoUrl;
public int width;
public int height;
public String desc;
public String type;
}
Parcelable
意为“包装、打包的”意思
// 序列化
@Override
public void writeToParcel(Parcel dest, int flags) {
}
// 反序列化
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User();
}
@Override
public User[] newArray(int size) {
return new User[0];
}
};
// 描述
// 基本所有情况都返回0, 当前对象中存在文件描述符时返回1
@Override
public int describeContents() {
return 0;
}
两者区别
- Serializable实现简单,只需实现一个接口。Parcelable使用起来比较麻烦,代码量多一些
- Serializable会使用反射,序列化和反序列化需要大量的I/O操作,并且创建了大量临时对象,造成大量GC,效率低一些。Parcelable是将一个完整的对象进行分解,效率更快,可能在10倍以上
- Serializable的一般是存储本地数据或者通过网络传输数据。Parcelable的一般在内存中使用,比如Intent,Bundle中传递数据等
总结
这只是简单的介绍了一下Serializable和Parcelable,将来用的多了有新的知识点了再总结一下
觉得不错的一篇文章:序列化Serializable和Parcelable的理解和区别