第十三篇:Android 序列化的两种方式

来源:互联网 发布:js 按键 编辑:程序博客网 时间:2024/05/22 03:35
1.Intent.putExtra 表示给intent携带一些额外的参数,多用于传递参数。
 Intent.putExtras表示给intent携带intent或者bundle,多用于传递一批参数。


 注意:如果intent要传递对象,则要实现序列化。


序列化:表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本
地。


序列化实现的两种方式:


1.实现Serializable,如Person,这样所有的person对象就都是可序列化的对象了。
2.实现Parcelable,可以指定对象中需要实现序列化的变量,未序列化的变量,获取为null.


如:让Person对象实现序列化,步骤如下,


1.需要重写describeContents()和writeToParcel(Parcel dest,int flags)这两个方法,其中describeContents()直接返回0即可,不用改,而writeToParcel()需要指定哪些变量需要被写出,被传输。


@Override
public void writeToParcel(Parcel dest,int flags){
dest.writeString(name);//写出name

dest.writeInt(age);//写出age

dest.writeByte((byte)isOlder?1:0);//写出boolean isOlder是否是老年人

dest.writeParcelable(parentObj,flags)//写出Person父亲对象;

}


2.还需要提供一个名为CREATOR的常量,并重写createFromParcel()和newArray()这两个方法,在newArray()中返回person的数组,大小为size,而在createFromParccel中去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,如:


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


@Override
public Person createFromParcel(Parcel source) {
Person person = new Person();
person.name = source.readString(); // 读取name

person.age = source.readInt(); // 读取age

person.isOlder = source.readByte != 0;// if source.readByte !=0    isOlder为true,否则为false.

person.parentObj = (Person)source.readParcelable(Person.class.getClassLoader());//读取Person父亲对象

return person;
}


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


注意:1.CREATOR必须大写才行。

     2.读取变量的顺序要和写出的顺序一致,否则可能会导致类型转换错误或者传错值。

3.传递boolean变量,可以转成byte或int型写出和读取.

原创粉丝点击