Android序列化Parcelable、Serializable

在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];
        }
    };
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章