注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

倚天剑

青春要在奔跑中度过

 
 
 

日志

 
 
 
 

序列化:Parcelable、Serializable  

2014-09-05 11:55:39|  分类: 开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、什么是序列化,实现序列化的目的是什么?

序列化就是为了 实现将对象状态转换为可保持或传输的格式的过程。

2、目的主要有以下三点:

1)永久性保存对象,保存对象的字节序列到本地文件中;

2)通过序列化对象在网络中传递对象;

3)通过序列化在进程间传递对象。

3、为什么说Parcelable 比Serializable更高效

Serializable is a standard Java interface. You simply mark a class Serializable by implenting the interface, and Java will automatically serialize it in certain situations.

Parcelable is an Android specific interface where you implement the serialization yourself. It was created to be far more efficient that Serializable, and to get around some problems with the default Java serialization scheme.

从上可以看Serializable是java标准的,Parcelable是android提供的。

1)在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2).Serializable在序列化的时候采用了大量的反射,并且会产生大量的临时变量,从而产生过高的负载,而Parcelable没有这种情况。
3).但是,Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable 。

4、实现
1 Serializable 的实现,只需要继承  implements Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
2 Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

下面是Google给的例子:

  1. public class MyParcelable implements Parcelable {  
  2.      private int mData;  
  3.   
  4.      public int describeContents() {  
  5.          return 0;  
  6.      }  
  7.   
  8.      public void writeToParcel(Parcel out, int flags) {  
  9.          out.writeInt(mData);  
  10.      }  
  11.   
  12.      public static final Parcelable.Creator<MyParcelable> CREATOR  
  13.              = new Parcelable.Creator<MyParcelable>() {  
  14.          public MyParcelable createFromParcel(Parcel in) {  
  15.              return new MyParcelable(in);  
  16.          }  
  17.   
  18.          public MyParcelable[] newArray(int size) {  
  19.              return new MyParcelable[size];  
  20.          }  
  21.      };  
  22.        
  23.      private MyParcelable(Parcel in) {  
  24.          mData = in.readInt();  
  25.      }  
  26.  }  


5、实现例子

下面只给出关键部分代码,Person类跟Book类分别用了两种方式:

Person.java

  1. package com.tutor.objecttran;  
  2. import java.io.Serializable;  
  3. public class Person implements Serializable {  
  4.     private static final long serialVersionUID = -7060210544600464481L;   
  5.     private String name;  
  6.     private int age;  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public int getAge() {  
  14.         return age;  
  15.     }  
  16.     public void setAge(int age) {  
  17.         this.age = age;  
  18.     }  
  19.       
  20. }  

Book.java
  1. package com.tutor.objecttran;  
  2. import android.os.Parcel;  
  3. import android.os.Parcelable;  
  4. public class Book implements Parcelable {  
  5.     private String bookName;  
  6.     private String author;  
  7.     private int publishTime;  
  8.       
  9.     public String getBookName() {  
  10.         return bookName;  
  11.     }  
  12.     public void setBookName(String bookName) {  
  13.         this.bookName = bookName;  
  14.     }  
  15.     public String getAuthor() {  
  16.         return author;  
  17.     }  
  18.     public void setAuthor(String author) {  
  19.         this.author = author;  
  20.     }  
  21.     public int getPublishTime() {  
  22.         return publishTime;  
  23.     }  
  24.     public void setPublishTime(int publishTime) {  
  25.         this.publishTime = publishTime;  
  26.     }  
  27.       
  28.     public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {  
  29.         public Book createFromParcel(Parcel source) {  
  30.             Book mBook = new Book();  
  31.             mBook.bookName = source.readString();  
  32.             mBook.author = source.readString();  
  33.             mBook.publishTime = source.readInt();  
  34.             return mBook;  
  35.         }  
  36.         public Book[] newArray(int size) {  
  37.             return new Book[size];  
  38.         }  
  39.     };  
  40.       
  41.     public int describeContents() {  
  42.         return 0;  
  43.     }  
  44.     public void writeToParcel(Parcel parcel, int flags) {  
  45.         parcel.writeString(bookName);  
  46.         parcel.writeString(author);  
  47.         parcel.writeInt(publishTime);  
  48.     }  
  49. }  


则在发送的时候可以这样:

  1. //Serializeable传递对象的方法    
  2.     public void SerializeMethod(){    
  3.         Person mPerson = new Person();    
  4.         mPerson.setName("frankie");    
  5.         mPerson.setAge(25);    
  6.         Intent mIntent = new Intent(this,ObjectTranDemo1.class);    
  7.         Bundle mBundle = new Bundle();    
  8.         mBundle.putSerializable(SER_KEY,mPerson);    
  9.         mIntent.putExtras(mBundle);    
  10.             
  11.         startActivity(mIntent);    
  12.     }    
  13.     //Pacelable传递对象方法    
  14.     public void PacelableMethod(){    
  15.         Book mBook = new Book();    
  16.         mBook.setBookName("Android Tutor");    
  17.         mBook.setAuthor("Frankie");    
  18.         mBook.setPublishTime(2010);    
  19.         Intent mIntent = new Intent(this,ObjectTranDemo2.class);    
  20.         Bundle mBundle = new Bundle();    
  21.         mBundle.putParcelable(PAR_KEY, mBook);    
  22.         mIntent.putExtras(mBundle);    
  23.             
  24.         startActivity(mIntent);    
  25.     }    

接收的时候则为:

  1. Person mPerson = (Person)getIntent().getSerializableExtra(ObjectTranDemo.SER_KEY);    
  2.   
  3. Book mBook = (Book)getIntent().getParcelableExtra(ObjectTranDemo.PAR_KEY);    


5、Serializable存储本地实现例子

Person类实现了serializable

  1. public class Person implements Serializable {  
  2.     private static final long serialVersionUID = 2352771880324639355L;  
  3.   
  4.     public String name;  
  5.     public String address;  
  6.     public int age;  
  7.   
  8.     public Person(String name, String addresss, int age) {  
  9.         this.name = name;  
  10.         this.address = addresss;  
  11.         this.age = age;  
  12.     }  
  13.   
  14.     @Override  
  15.     public String toString() {  
  16.         StringBuilder builder = new StringBuilder();  
  17.         builder.append("name:" + name + ",");  
  18.         builder.append("address:" + address + ",");  
  19.         builder.append("age:" + age + "\n");  
  20.         return builder.toString();  
  21.     }  
  22. }  

测试主程序:

  1. public static void main(String[] args) {  
  2.         FileOutputStream fos = null;  
  3.         ObjectOutputStream oos = null;  
  4.         FileInputStream fis = null;  
  5.         ObjectInputStream ois = null;  
  6.   
  7.         Person person1 = new Person("张三""广东深圳"20);  
  8.         Person person2 = new Person("李三""山东日照"24);  
  9.         try {  
  10.             // 写  
  11.             File file = new File("E:/temp/1.txt");  
  12.             if (file.exists()) {  
  13.                 file.delete();  
  14.             }  
  15.             file.createNewFile();  
  16.   
  17.             ArrayList<Person> list = new ArrayList<Person>();  
  18.             list.add(person1);  
  19.             list.add(person2);  
  20.   
  21.             fos = new FileOutputStream(file);  
  22.             oos = new ObjectOutputStream(fos);  
  23.             oos.writeObject(list);  
  24.   
  25.             // 读  
  26.             fis = new FileInputStream(file);  
  27.             ois = new ObjectInputStream(fis);  
  28.             ArrayList<Person> list2 = (ArrayList<Person>) ois.readObject();  
  29.             for (int i = 0; i < list2.size(); i++) {  
  30.                 System.out.println("person:" + list2.get(i).toString());  
  31.             }  
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();  
  34.         } finally {  
  35.             try {  
  36.                 if (fos != null) {  
  37.                     fos.close();  
  38.                 }  
  39.                 if (oos != null) {  
  40.                     oos.close();  
  41.                 }  
  42.                 if (fis != null) {  
  43.                     fis.close();  
  44.                 }  
  45.                 if (ois != null) {  
  46.                     ois.close();  
  47.                 }  
  48.             } catch (Exception e2) {  
  49.             }  
  50.         }  
  51.   
  52.     }  
  评论这张
 
阅读(546)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017