在Android中序列化實體類的方法有兩種:
一:Serializable
優點:
- 此方法特別簡單,只需直接在實體類上聲明Serializable接口
缺點:
- 效率沒有Parcelable高
二:Parcelable,
優點:
- 序列化及反序列號效率高
缺點:
- 當數據將會被緩存進內存中的時候不建議這麼做,容易導致數據丟失
使用方法:
先碼上未被序列化的實體類
public class Student { private String name; private int age; private List<Book> books; class Book{ private String bookName; private double bookPrice; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getBookPrice() { return bookPrice; } public void setBookPrice(double bookPrice) { this.bookPrice = bookPrice; } } 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; } public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } }
一:Serializable
只需在Student後加上Serializable如下public class Student implements Serializable{ private String name; private int age; private List<Book> books; class Book{ private String bookName; private double bookPrice; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getBookPrice() { return bookPrice; } public void setBookPrice(double bookPrice) { this.bookPrice = bookPrice; } } 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; } public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } }
二:Parcelable,
AndroidStudio建議使用插件然後打開File -> Settings -> Pugins -> Browse Repositories 如下,輸入android
parcelable code generator:
安裝成功後需要重啓AndroidStudio
Alt+ins鍵 然後點擊Parcelable
全選之後點擊OK
到了這一步有個坑,如果實體類中還有內部類的話到此還沒有結束!
運行時會報AndroidRunTime error:Parcel:unable to marshal value異常所以我們還有一步沒有完成
內部類Book也需要序列化
最後完整的Parcelable序列化的代碼如下
public class Student implements Parcelable { private String name; private int age; private List<Book> books; public static class Book implements Parcelable { private String bookName; private double bookPrice; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public double getBookPrice() { return bookPrice; } public void setBookPrice(double bookPrice) { this.bookPrice = bookPrice; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.bookName); dest.writeDouble(this.bookPrice); } public Book() { } protected Book(Parcel in) { this.bookName = in.readString(); this.bookPrice = in.readDouble(); } public static final Creator<Book> CREATOR = new Creator<Book>() { @Override public Book createFromParcel(Parcel source) { return new Book(source); } @Override public Book[] newArray(int size) { return new Book[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; } public List<Book> getBooks() { return books; } public void setBooks(List<Book> books) { this.books = books; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.name); dest.writeInt(this.age); dest.writeList(this.books); } public Student() { } protected Student(Parcel in) { this.name = in.readString(); this.age = in.readInt(); this.books = new ArrayList<Book>(); in.readList(this.books, Book.class.getClassLoader()); } public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() { @Override public Student createFromParcel(Parcel source) { return new Student(source); } @Override public Student[] newArray(int size) { return new Student[size]; } }; }