首页 > 代码库 > Android序列化

Android序列化

序列化介绍:

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

(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进行数据持久化

实现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 @Override23 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 @Override31 public Person[] newArray(int size) {32 // TODO Auto-generated method stub33 return new Person[size];34 }35 };36 @Override37 public int describeContents() {38 // TODO Auto-generated method stub39 Log.d(TAG,"describeContents");40 return 0;41 }42 @Override43 public void writeToParcel(Parcel dest, int flags) {44 // TODO Auto-generated method stub45 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 @Override11 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,谢谢作者

 

Android序列化