Android -序列化 : Serializable / Parcelable

来源:互联网 发布:手机淘宝点购买没反应 编辑:程序博客网 时间:2024/05/16 11:34

一、简介

● 序列化
  由于存在于内存中的对象都是暂时的,无法长期驻存,为了把对象的状态保持下来,这时需要把对象写入到磁盘或者其他介质中,这个过程就叫做序列化。

● 反序列化
  反序列化恰恰是序列化的反向操作,也就是说,把已存在在磁盘或者其他介质中的对象,反序列化(读取)到内存中,以便后续操作,而这个过程就叫做反序列化。

  概括性来说
  序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
  
对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
对象的反序列化:把字节序列恢复为Java对象的过程。

1、作用
Serializable的作用是为了 保存对象 的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。

而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的 传输数据 而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

2、效率及选择
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,

而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

3、编程实现
对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。

而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

二、android studio 中使用 Parcelable

1、在线安装

打开File -> Settings -> Pugins -> Browse Repositories 如下,输入android parcelable code generator:

然后就可以安装了,安装好了之后重启下就可以用啦~~

2、离线安装,点击这里下载安装包
下载好了之后,打开File -> Settings -> Pugins -> Install plugin from disk,选择你刚刚下载到的.zip压缩包,然后OK,重启就行啦

3、使用方法:
新建好一个实体类后写好属性:
按下Alt+Insert,选择Palcelable,选择需要的属性,按下OK,搞定~~很简单有木有!

demo演示:

1、首先建好一个测试用的person实体类:

2、然后一键生成之后如下,看看是不是你想要的,是的话就继续往下看:

package com.kroclin.myapplication;  import android.os.Parcel;  import android.os.Parcelable;  /**  * Created by KrocLin on 2014/11/7.  */  public class Person implements Parcelable {      private int age;      private String name;      private String gender;      @Override      public int describeContents() {          return 0;      }      @Override      public void writeToParcel(Parcel dest, int flags) {          dest.writeInt(this.age);          dest.writeString(this.name);          dest.writeString(this.gender);      }      public Person() {      }      private Person(Parcel in) {          this.age = in.readInt();          this.name = in.readString();          this.gender = in.readString();      }      public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {          public Person createFromParcel(Parcel source) {              return new Person(source);          }          public Person[] newArray(int size) {              return new Person[size];          }      };  }  

参考:

Android Studio酷炫插件(一)——自动化快速实现Parcelable接口序列化

三、Android studio 中使用 Serializable

serialVersionUID的作用不用说,唯一指定一个对象,如果没有制指定,那么每次修改对象都会自动生成一个serialVersionUID,那么序列号和反序列化就可能出问题,系统根据serialVersionUID认为这是俩个对象。

在eclipse中很容易的就能自动提示添加serialVersionUID,而在AndroidStudio中却没有提示,原来是as的检查配置中默认是关掉对serialVersionUID的检查的,那么我们打开就可以。

开启serialVersionUID

1、File -> Settings… -> Editor -> Inspections -> Serialization issues[在java类目下] -> Serializable class without ‘serialVersionUID’(选中)

生成serialVersionUID

2、进入实现了Serializable中的类,选中类名,Alt+Enter弹出提示,然后直接导入完成

demo:

public class MyProcess implements Serializable {    private static final long serialVersionUID = 7322176390951711093L;    private int age;    private String name;    private String gender;    public MyProcess() {    }    public MyProcess(int age, String name, String gender) {        this.age = age;        this.name = name;        this.gender = gender;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    @Override    public String toString() {        return "MyProcess{" +                "age=" + age +                ", name='" + name + '\'' +                ", gender='" + gender + '\'' +                '}';    }}

参考:

Android Studio类中实现Serializable自动生成serialVersionUID

如何让Android Studio 自动生成 serialVersionUID

阅读全文
0 0
原创粉丝点击