android学习笔记3 - 序列化接口Parcelable、Serializable的使用与区别

来源:互联网 发布:电缆计算软件app 编辑:程序博客网 时间:2024/05/17 01:45

两个接口的作用:

实现Parcelable就是为了进行序列化,android特有,高效

1.永久性保存对象,保存对象的字节序列到本地文件中;

2.通过序列化对象在网络中传递对象;

3.通过序列化在进程间传递对象。

同样,实现Serializable也是为了序列化,属于java特有,兼容性高:

1.可以提供一系列保存对象状态的方法网络发送;

2.文件储存对象状态;

3.管道发送对象给其他应用程序。

两者功能一致,对象,数组,线性表均可传输,但实现方式上有所区别。

Parcelable的实现

1.首先需要传输类实现这个接口,Parcel就是一个存放读取数据的容器,利用这个容器进行操作。Parcel机制:本质上把它当成一个Serialize就可以了。只是Parcel的对象实在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此更加高效。

2.重写public void writeToParcel(Parcel dest, int flags)方法,其中dest.write()方法用于写入数据,其中对象使用

方法dest.writeParcelable()进行传递,传递的对象必须实现Parcelable的接口。
3.在构造函数中增加顺序读取的方法,注意必须于写入程序相对应。

4.实例化静态内部对象CREATOR实现接口Parcelable.Creator

以下是整个类的定义:

package com.example.parcelableserializable;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import android.os.Parcel;import android.os.Parcelable;public class MyParcelable implements Parcelable{private int integer1,integer2;  //注意这个序列顺序private String string;private DataB objectb=new DataB();private DataA objecta=new DataA();private List<DataA> arraylist=new ArrayList<DataA>();public MyParcelable(){}public MyParcelable(Parcel parcle)   //构造函数中进行数据读取,注意序列化{integer1=parcle.readInt();string=parcle.readString();integer2=parcle.readInt();ClassLoader loader1=DataB.class.getClassLoader(); objectb=parcle.readParcelable(loader1);   //参数是类的加载器ClassLoader loader2=DataA.class.getClassLoader(); objecta=(DataA) parcle.readValue(loader2);   //对象是object,需要进行类型强制转换//获取数组的值Parcelable[] myparcel=parcle.readParcelableArray(loader2);DataA[] a=new DataA[myparcel.length];List<Parcelable> par=Arrays.asList(myparcel);DataA[] dataa=par.toArray(a);arraylist=Arrays.asList(dataa);}@Overridepublic int describeContents()  //内容描述,不用管{return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags)   //关键的数据传递,写入接口打包{dest.writeInt(integer1);dest.writeString(string);dest.writeInt(integer2);dest.writeParcelable(objectb, flags);dest.writeValue(objecta);DataA[] a=new DataA[arraylist.size()];   dest.writeParcelableArray(arraylist.toArray(a),flags);  //将按a类型对arraylist进行类型转换。} //实例化静态内部对象CREATOR实现接口Parcelable.Creatorpublic static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>()     {        public MyParcelable createFromParcel(Parcel in)         {            return new MyParcelable(in);        }        public MyParcelable[] newArray(int size)         {            return new MyParcelable[size];        }    };                public void setinteger1(int inta)    {    integer1=inta;    }        public int getinteger1()    {    return integer1;    }        public void setinteger2(int inta)    {    integer2=inta;    }        public int getinteger2()    {    return integer2;    }        public void setString(String stringa)    {    string=stringa;    }        public String getstring()    {    return string;    }        public void setDataA(DataA data)    {    objecta=data;    }        public DataA getDataA()    {    return objecta;    }    public void setDataB(DataB data)    {    objectb=data;    }        public DataB getDataB()    {    return objectb;    }        public void setarraylist(List array)    {    arraylist=array;    }        public List getarraylist()    {    return arraylist;    }}

MainActivity调用方法:

private MyParcelable mypar=new MyParcelable();Intent intent=new Intent();intent.setClass(this,TestActivity01.class);intent.putExtra("mypar",mypar);
在TestActivity01中调用获取:

mypar=(MyParcelable) this.getIntent().getExtras().get("mypar");

Serializable的实现:

这只是给对象打了一个标记,系统会自动将其序列化,作用是将数据对象存入字节流当中,在需要时重新生成对象

import java.io.Serializable;public class MySerializable implements Serializable  {private static final long serialVersionUID = 1L;    //序列idprivate int data;private String string;public MySerializable(){}public void setdata(int data){this.data=data;}public int getdata(){return data;}public void setstring(String string){this.string=string;}public String getstring(){return string;}}

调用方式与Parcelable基本一致:

private MySerializable myser=new MySerializable();Intent intent=new Intent();intent.setClass(this,TestActivity01.class);intent.putExtra("myser",myser);

TestActivity01中调用

myser=(MySerializable) this.getIntent().getExtras().get("myser");













0 0
原创粉丝点击