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的实现使用
参考
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的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 数据序列化总结
- Android 数据序列化总结
- Android数据存储(总结篇)
- 转载 Android获取网页数据的方法总结
- android 应用程序数据共享总结--Moon
- Android中Activity之间数据传递的几种方法总结
- Android 数据存储与共享 总结
- Android数据存储(总结篇)
- android: 横竖屏切换总结-布局改变和数据保存
- Android中Activity之间数据传递的几种方法总结
- Android数据缓冲区和数据流的学习总结
- android初级之Android获取网页数据的方法总结
- Android获取网页数据的方法总结
- Android应用程序四种数据存取方法总结
- Android数据存储(总结篇)
- android ListView 数据更新的总结
- Android数据缓冲区和数据流的学习总结(BufferedWriter、BufferedOutputStream和FileOutputStream)
- Android项目技术总结:主界面中ListView装载数据并结合手势进行翻页
- Android -- Parcelable 序列化操作数据(上篇)