Android序列化+Parcelable和Serializable

序列化介绍:

一、序列化、反序列化是什么?

(1) 名词解释

对象的序列化 : 把Java对象转换为字节序列并存储至一个储存媒介的过程。
对象的反序列化:把字节序列恢复为Java对象的过程。

(2) 序列化详细解释

对象的序列化涉及三个点关键点:Java对象、字节序列、存储。

1. Java对象的组成?
Java对象包含变量与方法。但是序列与反序列化仅处理Java变量而不处理方法,序列与反序列化仅对数据进行处理。

2. 什么是字符序列?
字符序列是两个词,字符是在计算机和电信领域中,字符(Character)是一个信息单位。数学上,序列是被排成一列的对象(或事件)。
《字符-维基百科》 , 《序列-维基百科》 说白了就是连续排列的多个字符的集合。类似于1A165613246546

3. 存储
字符序列需要保存到一个地方,可以是硬盘也可以是内存。
简单说法是:序列化把当前对象信息保存下来。反序列化刚好相反的操作。

二、Java对象与Java对象序列化的区别?

Java对象存在的前提必须在JVM运行期间存在,如果想在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象,在现有Java对象的机制下都不可能完成。
与Java对象不同的是,如果对Java对象执行序列化操作,因为原理是把Java对象信息保存到存储媒介,所以可以在以上Java对象不可能存在的两种情况下依然可以使用Java对象。

三、为什么要使用序列化、反序列化?

根据以上对序列化、反序列化的理解,这个疑问可以翻译成,为什么需要把对象信息保存到存储媒介中并之后读取出来?
因为二中的解释,开发中有在JVM非运行的情况下或者在其他机器JVM上获取指定Java对象的需求。

 

Android序列化-- Parcelable和Serializable

序列化用处:

1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程或activity间传递对象。

 

android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。

介绍:

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。

而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

效率:

1.Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用     Serializable 

4.Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

 

1、实现Serializable接口

    Serializable的作用是将数据对象存入字节流当中,在需要时重新生成对象,主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。

    implements Serializable接口的的作用就是给对象打了一个标记,系统会自动将其序列化。

    

    案例1:

 1)User.java  (implements Serializable )

 2)MainActivity.java  

     User user = new User();

     Intent intent = new Intent(this,Second.class);  

     intent.putExtra("user",user);

 3)Second.java

     Intent intent = getIntent();

     User user = intent.getSerializableExtra("user");

 

2、实现Parcelable接口

 

实现Parcelable接口的方法

通过实现Parcelable接口序列化对象的步骤:

1、实现Parcelable接口。

2、并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。

3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。

简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致

代码示例:

 1 package parcelable_test.com;
 2 import android.os.Parcel;  
 3 import android.os.Parcelable; 
 4 import android.util.Log;
 5 public class Person implements Parcelable{
 6 private String name;
 7 private int age;
 8 private static final String TAG = ParcelableTest.TAG; 
 9 public String getName() {
10 return name;
11 }
12 public void setName(String name) {
13 this.name = name;
14 }
15 public int getAge() {
16 return age;
17 }
18 public void setAge(int age) {
19 this.age = age;
20 }
21 public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
22 @Override
23 public Person createFromParcel(Parcel source) {
24 Log.d(TAG,"createFromParcel");
25 Person mPerson = new Person();
26 mPerson.name = source.readString();
27 mPerson.age = source.readInt();
28 return mPerson;
29 }
30 @Override
31 public Person[] newArray(int size) {
32 // TODO Auto-generated method stub
33 return new Person[size];
34 }
35 };
36 @Override
37 public int describeContents() {
38 // TODO Auto-generated method stub
39 Log.d(TAG,"describeContents");
40 return 0;
41 }
42 @Override
43 public void writeToParcel(Parcel dest, int flags) {
44 // TODO Auto-generated method stub
45 Log.d(TAG,"writeToParcel");
46 dest.writeString(name);
47 dest.writeInt(age);
48 }
49 }

 

通过Parcelable接口传递一些数据:

 1 //仅贴出代表性代码
 2 private void fun(){  
 3 Log.d(TAG, "fun");  
 4 Person mPerson = new Person();  
 5 mPerson.setName("tom");  
 6 mPerson.setAge(25);  
 7 //activity跳转
 8 Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);  
 9 Bundle mBundle = new Bundle();  
10 mBundle.putParcelable(KEY, mPerson);  
11 mIntent.putExtras(mBundle);  
12 startActivity(mIntent);  
13 }  

 ParcelableTest2.java,这个类用于获取ParcelableTest传出的数据,并显示在UI上:

 1 package parcelable_test.com;
 2  
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.widget.TextView;
 7  
 8 public class ParcelableTest2 extends Activity{
 9 private static final String TAG = ParcelableTest.TAG;
10 @Override
11 public void onCreate(Bundle savedInstanceState) {  
12         super.onCreate(savedInstanceState);  
13         setContentView(R.layout.main);     
14         Log.d(TAG, "ParcelableTest2");
15         TextView textView = new TextView(this);
16         Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);
17         textView.setText("name = " + mPerson.getName() + "  age = " + mPerson.getAge());
18         setContentView(textView);
19     } 
20 }

 

 

 

部分来自:http://www.2cto.com/kf/201403/288476.html,http://blog.csdn.net/zyc13701469860/article/details/6429934,谢谢作者

 

posted @ 2014-09-11 10:39  will_N  阅读(613)  评论(0编辑  收藏  举报