android学习随笔-序列化的三种方式
序列化
1.Serializable
Java序列化就是指把Java对象转换为字节序列的过程
Java反序列化就是指把字节序列恢复为Java对象的过程。
实现序列化和反序列化的三种实现:
①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。
ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。
ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。
②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。
ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。
ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。
③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。
ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。
ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。
//序列化实例
public class SerializableTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
FileOutputStream fos = new FileOutputStream("object.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student student1 = new Student("lihao", "wjwlh", "21");
oos.writeObject(student1);
oos.flush();
oos.close();
//反序列化
FileInputStream fis = new FileInputStream("object.out");
ObjectInputStream ois = new ObjectInputStream(fis);
Student student2 = (Student) ois.readObject();
System.out.println(student2.getUserName()+ " " +
student2.getPassword() + " " + student2.getYear());
}
}
//对象
public class Student implements Serializable{
private static final long serialVersionUID = -6060343040263809614L;
private String userName;
private String password;
private String year;
public String getUserName() {
return userName;
}
public String getPassword() {
return password;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password) {
this.password = password;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public Student(String userName, String password, String year) {
this.userName = userName;
this.password = password;
this.year = year;
}
}
2.Parcelable
public class NewClient implements Parcelable {
public int id;
public String name;
public User user;
/**
* 当前对象的内容描述,一般返回0即可
* @return
*/
@Override
public int describeContents() {
return 0;
}
/**
* 将当前对象写入序列化结构中
* @param dest
* @param flags
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(this.name);
dest.writeParcelable(this.user,0);
}
public NewClient() {
}
/**
* 从序列化后的对象中创建原始对象
* @param in
*/
protected NewClient(Parcel in) {
this.id = in.readInt();
this.name = in.readString();
//User是另一个序列化对象,此方法序列需要传递当前线程的上下文类加载器,否则会报无法找到类的错误
this.user=in.readParcelable(Thread.currentThread().getContextClassLoader());
}
/**
* public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。
* 重写接口中的两个方法:
* createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,
* newArray(int size) 创建一个类型为T,长度为size的数组,供外部类反序列化本类数组使用。
*/
public static final Parcelable.Creator<NewClient> CREATOR = new Parcelable.Creator<NewClient>() {
/**
* 从序列化后的对象中创建原始对象
*/
@Override
public NewClient createFromParcel(Parcel source) {
return new NewClient(source);
}
/**
* 创建指定长度的原始对象数组
* @param size
* @return
*/
@Override
public NewClient[] newArray(int size) {
return new NewClient[size];
}
};
}
3.XML JSON
//序列化
Gson gson=new Gson();
gson.toJson(对象);
//反序列化
Type type=new TypeToken<对象类型>>(){}.getType();
gson.fromJson(对象的json数据,type);