Serializable
Serializable的序列化和反序列化
关于 versionUID
- 用来辅助 序列化和反序列化的
- 原则上来说, 序列化后的数据中的 versionUID 只有和当前类的versionUID相同才能正常的反序列化
- 序列化时会把 versionUID 写入到序列化后的文件中
- 反序列化时会检测文件中的versionUID和当前类的versionUID,一致才可以正常的反序列化;否则报异常
注意
- 静态成员变量 属于类,不属于对象,不会被序列化
- 用 transient关键词标记的成员变量*不参与序列化过程
Parcelable
Parcelable序列化过程
package com.example.tuionf.learntest;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by tuionf on 2017/2/4.
*/
public class Person implements Parcelable{
private String name;
private int age;
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
Person person = new Person();
person.name = in.readString();
person.age = in.readInt();
return person;
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
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;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
- 实现 Parcelable 接口
- 实现该接口的 describeContents 和 writeToParcel 方法,describeContents 方法返回0就可以;writeToParcel方法需要调用Parcel的writeXXX方法,将Person类中的字段一一列出
- 提供一个 Creator 类 泛型是Person的 常量,重写createFromParcel和newArray方法;在createFromParcel中读取刚才的name 和 age 字段,返回一个Person对象,注意读取顺序和刚写写入顺序相同,newArray方法返回一个 size大小的Person数组就可以
两种序列化的区别
Serializable
- 使用简单,开销很大(大量IO操作)
- 一般将对象序列化到 存储设备或者网络传输
Parcelable
- 使用复杂,效率很高
- Android推荐的序列化方式
- 主要用在内存的序列化上