Android笔记之对象序列化

Android笔记之对象序列化

引言

  在多进程间通信时,只有对象可序列化的前提下,才能进行传输。在Android中通过Intent和Bundle传输数据时;把对象持久化到存储设备上或者通过网络设备传输给其它客户端时;都需要用可序列化。 而 Serializable 和 Parcelable 接口可完成对象的可序列化过程。

1,Serializable 接口

   Serializable接口是 Java 所提供的一个序列化接口,是空接口,为对象提供了标准的序列化和反序列化操作。
   需可序列化的对象只需要实现 Serializable接口并声明一个 serialVersionUID 即可:

public class Person implements Serializable {
    //算定义一个值,也可不定义
    private static final long serialVersionUID  = 100L;

    public String mName;
    public int mAge;
    ...
}

  进行序列化和反序列化:

    //序列化过程
    Person person = new Person("steven", 27);
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.text));
    out.writeObject(perion);
    out.close();

    //反序列化过程
    ObjectOutputStream in= new ObjectOutputStream(new FileIntputStream("cache.text));
    Person person = (Person)in.readObject();
    in.close();

[注]

  1. 序列化后的数据中serialVersionUID值只有和当前类的serialVersionUID 相同能才正常被反序列化。
  2. 静态成员变量属于类不不属于对象,不参考序列化过程;
  3. 用 transient 关键字标记的成员变量也不参考序列化过程。

2,Parcelable 接口

  Parcelable 接口是Android提供可序列化接口,只要实现这个接口,一个类的对象就可以实现序列化并通过Intent和Bundle传输。

  1. 实现Parcelable接口
  2. 添加实体属性
  3. 覆写writeToParcel(Parcel dest, int flags)方法,指定写入Parcel类的数据。
  4. 创建Parcelable.Creator静态对象,有两个方法createFromParcel(Parcel
    in)与newArray(int size),前者指定如何从Parcel中读取出数据对象,后者创建一个数组。
  5. 覆写describeContents方法,默认返回0。
    下面以官网的一个例子:
 public class MyParcelable implements Parcelable {
     private int mData;
     public int describeContents() {
         return 0;
     }
     //将当前对象写入序列人结构中
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
     }
     public 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];
         }
     };
     //从序列化后的对象中创建都原始对象
     private MyParcelable(Parcel in) {
         mData = in.readInt();
     }
 }

   Parcel 内部包装了可序列化的数据,可以在 Binder 中自由传输。序列化功能由 writeToParcel 方法完成,最终是通过 Pracel 中的一系列 write 方法来完成的。而反序列化功能 由 CARATOR 来完成,其内部标明了如何创建序列化对象和数组,并通过 Pracel 的一系列 read 方法来完成反序列化过程;内容描述功能由 describeContents 方法来完成,几乎情况都返回0;


Parcel

  Parcel就是一个存放读取数据的容器, android系统中的binder进程间通信(IPC)就使用了Parcel类来进行客户端与服务端数据的交互,而且AIDL的数据也是通过Parcel来交互的。在Java空间和C++都实现了Parcel,由于它在C/C++中,直接使用了内存来读取数据,因此,它更有效率。这里不打算研究它的实现,这里只列一下它常用方法:

  1. 基本类型

    //写入
    writeByte(byte)
    writeDouble(double)
    writeFloat(float)
    writeInt(int)
    writeLong(long)
    writeString(String)
    //读取
    readByte()
    readDouble()
    readFloat()
    readInt()
    readLong()
    readString()
  2. 基本类型数组

    writeBooleanArray(boolean[]),
    readBooleanArray(boolean[]),
    createBooleanArray()
    
    writeByteArray(byte[]),
    writeByteArray(byte[], int, int),
    readByteArray(byte[]),
    createByteArray()
    
    writeCharArray(char[]),
    readCharArray(char[]),
    createCharArray()
    
    writeDoubleArray(double[])
    readDoubleArray(double[])
    createDoubleArray()
    
    writeFloatArray(float[])
    readFloatArray(float[])
    createFloatArray()
    
    writeIntArray(int[])
    readIntArray(int[])
    createIntArray()
    
    writeLongArray(long[])
    readLongArray(long[])
    createLongArray()
    
    writeStringArray(String[])
    readStringArray(String[])
    createStringArray().
    
    writeSparseBooleanArray(SparseBooleanArray),
    readSparseBooleanArray().
  3. Parcelables 对象

    //主要方法
    writeParcelable(Parcelable, int)
    readParcelable(ClassLoader)
    
    writeParcelableArray(T[], int)
    readParcelableArray(ClassLoader)    

    更多方法和介绍请参考官网: 【Developers: Parce】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值