注意:
静态成员变量属于类不属于对象
transient关键字标记的成员变量不参与序列化过程.
基础概念:
对象的序列化
Serializable
第一步 实现Serializable接口
第二步 声明一个seralVersionUID (不是必须的) 方便我们反序列化 如果反序列化失败了就要手动的设置一个这个值
Parcelable
同Serializable一样 都是实现序列化的方法 此方法可以通过Intent和Binder传递
/**
* Created by Panda_Program on 2016/12/30 0030.
*/
public class Person implements Parcelable {
private String username;
private String nickname;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String username, String nickname, int age) {
super();
this.username = username;
this.nickname = nickname;
this.age = age;
}
public Person() {
super();
}
/**
* 这里默认返回0即可
*/
@Override
public int describeContents() {
return 0;
}
/**
* 把当前对象写入Parcel中 实现了序列化功能
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(username);
dest.writeString(nickname);
dest.writeInt(age);
}
/**
* 这里的读的顺序必须与writeToParcel(Parcel dest, int flags)方法中
* 写的顺序一致,否则数据会有差错,比如你的读取顺序如果是:
* nickname = source.readString();
* username=source.readString();
* age = source.readInt();
* 即调换了username和nickname的读取顺序,那么你会发现你拿到的username是nickname的数据,
* 而你拿到的nickname是username的数据
* @param source
*/
//从序列化后的对象中创建原始对象
public Person(Parcel source) {
username = source.readString();
nickname=source.readString();
age = source.readInt();
}
//反序列化
public static final Creator<Person> CREATOR = new Creator<Person>() {
/**
* 供外部类反序列化本类数组使用
*/
@Override
public Person[] newArray(int size) {
return new Person[size];
}
/**
* 从Parcel中读取数据
*/
@Override
public Person createFromParcel(Parcel source) {
return new Person(source);
}
};
}
系统为我们提供了许多实现了Parcelable接口的类都是可以直接序列化的,例如 Intent Bundle Bitmap List和Map(内部元素都必须是可序列化的)
两种序列化接口的区别:
Serializable 是Java中序列化接口
特点:使用简单 开销很大 需要大量的IO操作
Parcelable 是android的序列化方式
特点 效率高但是使用麻烦