Serializable和Parcelable总结

前言

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的理解和区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值