Android -序列化 : Serializable / Parcelable

一、简介

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

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

  概括性来说
  序列化是指将对象实例的状态存储到存储媒体(磁盘或者其他介质)的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
  
对象的序列化 : 把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 CREATOR = new Parcelable.Creator() {  
        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

你可能感兴趣的:(Android基础,存储,json,解析)