Android中Serializable和Parcelable序列化对象详解

2019-12-10 19:00:46于海丽

1).整个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高很多

2).读写时是4字节对齐的,可以看到#define PAD_SIZE(s) (((s)+3)&~3)这句宏定义就是在做这件事情

3).如果预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%

4).对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()和unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用重新new一个新对象。
6.相关实例

最后上一个例子..

首先是序列化的类Book.class

public class Book implements Parcelable{
 private String bookName;
 private String author;
 private int publishDate;
 
 public Book(){
  
 }
 
 public String getBookName(){
  return bookName;
 }
 
 public void setBookName(String bookName){
  this.bookName = bookName;
 }
 
 public String getAuthor(){
  return author;
 }
 
 public void setAuthor(String author){
  this.author = author;
 }
 
 public int getPublishDate(){
  return publishDate;
 }
 
 public void setPublishDate(int publishDate){
  this.publishDate = publishDate;
 }
 
 @Override
 public int describeContents(){
  return 0;
 }
 
 @Override
 public void writeToParcel(Parcel out, int flags){
  out.writeString(bookName);
  out.writeString(author);
  out.writeInt(publishDate);
 }
 
 public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>(){
  
     @Override
  public Book[] newArray(int size){
   return new Book[size];
  }
  
  @Override
  public Book createFromParcel(Parcel in){
   return new Book(in);
  }
 };
 
 public Book(Parcel in){
  //如果元素数据是list类型的时候需要: lits = new ArrayList<?> in.readList(list); 否则会出现空指针异常.并且读出和写入的数据类型必须相同.如果不想对部分关键字进行序列化,可以使用transient关键字来修饰以及static修饰.
  bookName = in.readString();
  author = in.readString();
  publishDate = in.readInt();
 }
}

第一个Activity,MainActivity

Book book = new Book();
book.setBookname("Darker");
book.setBookauthor("me");
book.setPublishDate(20);
Bundle bundle = new Bundle();
bundle.putParcelable("book", book);
Intent intent = new Intent(MainActivity.this,AnotherActivity.class);
intent.putExtras(bundle);