android知识回顾-----序列化对象

.序列化的目的

2.Android中序列化的两种方式

3.Parcelable与Serializable的性能比较

4.Android中如何使用Parcelable进行序列化操作

5.Parcelable的工作原理

6.相关实例

 1.序列化的目的

 1).永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中

  2).通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)

  3).将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)

  4).Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)

  5).序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.

  6).在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了.

2.Android中实现序列化的两种方式
1).Implements Serializable 接口 (声明一下即可)
Serializable 的简单实例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Person implements Serializable{
  private static final long serialVersionUID = -7060210544600464481L;
  private String name;
  private int age;
  
  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;
  }
}

2).Implements Parcelable 接口(不仅仅需要声明,还需要实现内部的相应方法)
Parcelable的简单实例:

注:写入数据的顺序和读出数据的顺序必须是相同的.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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();
  }
}

  我们知道在Java应用程序当中对类进行序列化操作只需要实现Serializable接口就可以,由系统来完成序列化和反序列化操作,但是在Android中序列化操作有另外一种方式来完成,那就是实现Parcelable接口.也是Android中特有的接口来实现类的序列化操作.原因是Parcelable的性能要强于Serializable.因此在绝大多数的情况下,Android还是推荐使用Parcelable来完成对类的序列化操作的.

3.Parcelable与Serializable的性能比较

首先Parcelable的性能要强于Serializable的原因我需要简单的阐述一下

  1). 在内存的使用中,前者在性能方面要强于后者

  2). 后者在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色

  3). Parcelable是以Ibinder作为信息载体的.在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable,既然是内存方面比价有优势,那么自然就要优先选择.

  4). 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上.

  但是:虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值