您的位置:首页 > 移动开发 > Android开发

Android中数据的序列化总结(一)

2016-11-12 15:41 204 查看
    进行Android开发的时候,我们都知道不能将对象的引用传给Activities或者Fragments,我们需要将这些对象放到一个Intent或者Bundle里面,然后再传递。

    通过Android的API,我们知道有两种选择,即在传递对象时,需要对我们的对象进行Parcelable或者Serializable化。

    Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流以方便数据传输,当然这种传输可以是程序内也可以是两个程序间。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。给一个连接可以瞅瞅他们序列化的区别http://greenrobot.me/devpost/android-parcelable-serializable/

    Android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器,封装后的数据可以通过Intent或IPC传递,除了基本类型外,只有实现了Parcelable接口的类才能放入parcel中。  parcel一般都用在Binder通信,通过read和write方法进行客户端与服务端的数据传递(通信)。

    首先我们来看一下官方API对Parcelable的描述:

    Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.

    Parcelable的定义

    下面我们看看parcelable的源码:

   


    内容描述:

   


   
写入接口函数,用来打包:

   


   读取接口,目的是从parcel中构造一个实现了parcelable的类的实例对象,因为实现类这里是不可知的,所以需要用到模板的方法,继承类通过模板参数传入。

    为了能够实现模板参数的传入,定义了creator嵌入接口,两个接入函数分别是单个和多个继承类实例。

public interface Creator<T> {

    public T createFromParcel(Parcel source);

    public T[] newArray(int size);

}

   Parcelable的实现使用

import android.os.Parcel;
import android.os.Parcelable;

public class MediaObject implements Parcelable {

public static final int DATA_TYPE_MUSIC = 0;
public static final int DATA_TYPE_PHOTO = 1;
public static final int DATA_TYPE_VIDEO = 2;

protected long id = -1;
protected String name;
protected int type = DATA_TYPE_MUSIC;
protected String sourceType;
protected Object tag;

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getName() {
return (name != null) ? name : "";
}

public void setName(String name) {
this.name = name;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}

public String getSourceType() {
if (sourceType == null) {
return MediaDataSource.MEDIA_DATASOURCE_INTERNAL;
}
return sourceType;
}

public void setSourceType(String sourceType) {
this.sourceType = sourceType;
}

public Object getTag() {
return tag;
}

public void setTag(Object tag) {
this.tag = tag;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(getId());
dest.writeString(getName());
dest.writeInt(getType());
dest.writeString(getSourceType());
}

public static final Parcelable.Creator<mediaobject> CREATOR = new Parcelable.Creator<mediaobject>() {

@Override
public MediaObject createFromParcel(Parcel in) {
MediaObject obj = new MediaObject();
obj.setId(in.readLong());
obj.setName(in.readString());
obj.setType(in.readInt());
obj.setSourceType(in.readString());
return obj;
}

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

}


参考

1.Android-Parcelable理解与使用(对象序列化) https://my.oschina.net/zhoulc/blog/172163
2.Android的Parcelable接口用法http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html

3.Android Parcelable和Serializable的区别 http://www.cnblogs.com/trinea/archive/2012/11/09/2763213.html
4.Android系统中Parcelable和Serializable的区别 http://greenrobot.me/devpost/android-parcelable-serializable/ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android Parcelable