Android序列化浅析

一、序列化是什么:

序列化是指把Java对象转换为字节序列并存储到一个存储媒介的过程。反之,把字节序列恢复为Java对象的过程则称之为反序列化。

二、为什么要序列化:

Java对象存在的一个前提是JVM有在运行,因此,如果JVM没有运行或者在其他机器的JVM上是不可能获取到指定的Java对象的。而序列化操作则是把Java对象信息保存到存储媒介,可以在以上不可能的情况下仍然可以使用Java对象。

三、序列化的主要作用:

永久性保存对象,保存对象的字节序列到本地文件中;
通过序列化对象在网络中传递对象;
通过序列化在进程间传递对象。

四、Android中序列化:

在Android开发中,经常需要在多个部件(Activity、Fragment或Service)之间通过Intent传递一些数据,如果是一些普通类型的数据可以通过PutExtra()进行传递,如果是对象的话就得先进行序列化才能传递了。在Android中有两种序列化的接口,Serializable和Parcelable。

Serializable:(JavaSE本身就支持的)保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
Parcelable:(Android特有功能)因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效
的传输数据而设计,这些数据仅在内存中存在。

五、Parcelable和Serializable的比较:

区别 Serializable Parcelable
所属API JAVA API Android SDK API
原理 序列化和反序列化过程需要大量的I/O操作 序列化和反序列化过程不需要大量的I/O操作
开销 开销大 开销小
效率 很高
使用场景 序列化到本地或者通过网络传输 内存序列化

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。

对于使用序列化还有两点需要了解:
1.静态成员变量属于类不属于对象,所以不参与序列化过程
2.用transient关键字标记的成员变量不参与序列化过程

六、两种序列化方式的实现:

Serializable接口的实现
只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。

public class DataBean implements Serializable{
...
}

Parcelable接口的使用
Parcelable实现方式略复杂一些,需重写describeContents和writeToParcel这两个方法提供一个名为CREATOR常量。实际上就是将如何打包和解包的工作自己来定义,
而序列化的这些操作完全由底层实现。

public class DataBean implements Parcelable{
private int id;
private String name;
private String Account;
private int kind;
private String password;
private String desc;

public DataBean(){}
// 用来创建自定义的Parcelable的对象
public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
    @Override
    public DataBean createFromParcel(Parcel in) {
        return new DataBean(in);
    }

    @Override
    public DataBean[] newArray(int size) {
        return new DataBean[size];
    }
};

   //GET SET方法
   ...

@Override
public String toString() {
    return "DataBean{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", Account='" + Account + '\'' +
            ", kind=" + kind +
            ", password='" + password + '\'' +
            ", desc='" + desc + '\'' +
            '}';
}

@Override
public int describeContents() {
    return 0;
}
// 写数据进行保存
@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(this.id);
    dest.writeString(this.Account);
    dest.writeString(this.name);
    dest.writeString(this.password);
    dest.writeInt(this.kind);
    dest.writeString(this.desc);
}
// 读数据进行恢复
protected DataBean(Parcel in) {
    this.id = in.readInt();
    this.kind = in.readInt();
    this.password = in.readString();
    this.name = in.readString();
    this.Account = in.readString();
    this.desc = in.readString();
}

}
这样就完成了对DataBean的序列化,使用的时候就可以通过Intent进行传递了。

//Activity传递对象,不管是实现哪个接口都是用如下方式传递
intent.putExtra("data",data);

//在另一个Activity中接收对象的方式分别是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,742评论 25 709
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 13,765评论 0 24
  • 我把窗户关上,开了风扇。 洪老师说:“外面有风啊,”一边打开窗户,“你看!”一回头,“哦不对,原来是风扇…”
    雪杉非狐阅读 1,549评论 2 2
  • “嘿,他们说你喜欢我。” 小七坐在W对面,看着他说道,脸上漫不经心,心里紧张的要命。毕竟,这种试探,她不擅长。结果...
    Daosy_氵阅读 1,247评论 0 0
  • 窈窕无心招惹风, 玄冥戏虐技思穷。 披肩落白坚贞骨, 昂首提胸气贯空。 文/闲云 2017.01.18
    2b4c67af34a7阅读 1,382评论 0 1

友情链接更多精彩内容