序列化介绍:
一、序列化、反序列化是什么?
(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,谢谢作者