序列化
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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356276.html
標籤:其他
