折腾:
【已解决】rcsjta项目编译出错:DisplayGeoloc.java使用了未经检查或不安全的操作
期间,去搞懂Serializable和Parcelable
Serializable vs Parcelable in Android
【总结】
- Serializable
- 设计初衷
- 为了序列化对象到本地文件、数据库、网络流、RMI以便数据传输
- 支持
- 程序内
- 两个程序间
- 特点:方法虽然十分简单,但是效率却不容乐观
- 它会把整个对象序列化,开销十分大
- Parcelable
- 设计初衷
- 背景:Serializable效率过低,消耗大
- 而android中数据传递主要是在内存环境中
- 内存属于android中的稀有资源
- 设计Parcelable,满足数据在内存中低开销而且高效地传递问题
- 特点:提高了效率
- 减少了(内存)资源占用
结论:
- Android应用程序在内存间数据传输时推荐使用:Parcelable
- 如
- activity间传输数据和AIDL数据传递
- 将对象序列化到存储设置中或将对象序列化后通过网络传输时建议选择:Serializable
- 原因:Serializable将数据持久化的操作方便
- 其他说明
- Parcelable也是可以,只不过实现和操作过程过于麻烦
- 并且为了防止android版本不同而导致Parcelable可能不同的情况
- 因此在序列化到存储设备或者网络传输方面还是尽量选择Serializable接口
提示:
- 无论是Parcelable还是Serializable,执行反序列操作后的对象都是新创建的
- 与原来的对象并不相同
- 只不过内容一样罢了
注:
Parcelable的实现:
令自定义类实现Parcelable接口,这个时候必须重写两个方法
- 1.describeContents(): 用于描述内容接口,一般直接 return 0即可
- 2.writeToParcel() : 用于将想要传递的数据写入到Parcel容器中。
除了这两个方法以外,我们还需要创建一个 Parcelable.Creator接口的实现,这个接口中也需要我们实现两个方法
- 1.createFromParcel() : 用于将写入Parcel容器中的数据读出来,用读出来的数据实例化一个对象,并且返回。
- 2.newArray() :创建一个长度为 size 的数组并且返回,一般而言,直接返回return T[size] 即可。
举例,此处的:
src/main/java/com/gsma/services/rcs/Geoloc.java
public class Geoloc implements Parcelable, Serializable { /** * Describe the kinds of special objects contained in this Parcelable's marshalled * representation. * * @return Integer * @hide */ public int describeContents() { return 0; } /** * Write parcelable object. * * @param dest The Parcel in which the object should be written * @param flags Additional flags about how the object should be written * @hide */ public void writeToParcel(Parcel dest, int flags) { dest.writeString(mLabel); dest.writeDouble(mLatitude); dest.writeDouble(mLongitude); dest.writeLong(mExpiration); dest.writeFloat(mAccuracy); } /** * Parcelable creator. * * @hide */ public static final Parcelable.Creator<Geoloc> CREATOR = new Parcelable.Creator<Geoloc>() { public Geoloc createFromParcel(Parcel source) { return new Geoloc(source); } public Geoloc[] newArray(int size) { return new Geoloc[size]; } };
供参考。