序列化:序列化是java用来保存object对象的状态到内存里,可以通过write和read来读取对象的状态。android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。
Serializable接口是Java SE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,但是实现比Serializable复杂
使用序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程或activity间传递对象。
两种序列化选取参考原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况
【1】单纯内存操作,从一块内存序列化到另一块内存或者从一个网络对象序列化到另一个网络对象时,Parcelable比Serializable性能高,通常在这种场景下使用Parcelable
【2】需要将数据写入到磁盘时,需要注意,Parcelable类不能保证数据的准确性,建议还是使用Serializable,虽然它还是有一些缺点,但是毕竟是JDK提供的。
Serializable接口的序列化:该类implements Serializable
import java.io.*;
public class Box implements Serializable
{
private int width;
private int height;
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}
public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30);
try{
//这块主要是用IO流写入myBox对象
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
Parcelable接口序列化对象:implements Parcelable
[java]
import android.os.Parcel;
import android.os.Parcelable;
public class StudentParcelable implements Parcelable {
public String name;
public int age;
public StudentParcelable(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@Override
public int describeContents() {
return 0;
}
//parcel实现参数的序列化,把类对象序列化为齐位的二进制流,提高传输的效率。
@Override
public void writeToParcel(Parcel parcel, int flag) {
parcel.writeString(name);
parcel.writeInt(age);
}
//实例化静态内部对象CREATOR实现接口Parcelable.Creator
public static final Creator<StudentParcelable> CREATOR = new Creator<StudentParcelable>() {
public StudentParcelablecreateFromParcel(Parcel in) {
return new StudentParcelable(in);
}
public StudentParcelable[] newArray(int size) {
return new StudentParcelable[size];
}
};
private StudentParcelable(Parcel in) {
name = in.readString();
age = in.readInt();
}
}
界面之间传值可以通过Bundle.putParcelable(“student”,new StudentParacelable(“张三”,23)),接受就相当简单了,不在这理出来了。