一.序列化原因:
1.永久性保存對象,保存對象的字節序列到本地文件中;
2.通過序列化對象在網絡中傳遞對象;
3.通過序列化在進程間傳遞對象。
二.至於選取哪種可參考下面的原則:
1.在使用內存的時候,Parcelable 類比Serializable性能高,所以推薦使用Parcelable類。
2.Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
3.Parcelable不能使用在要將數據存儲在磁盤上的情況,因爲Parcelable不能很好的保證數據的持續性在外界有變化的情況下。儘管Serializable效率低點, 也不提倡用,但在這種情況下,還是建議你用Serializable 。
實現:
1.Serializable 的實現
只需要繼承 implements Serializable 即可。這只是給對象打了一個標記,系統會自動將其序列化。
2.Parcelabel 的實現
1)writeToParcel 方法。該方法將類的數據寫入外部提供的Parcel中.聲明如下:writeToParcel (Parcel dest, int flags) 具體參數含義見javadoc
2)describeContents方法。沒搞懂有什麼用,反正直接返回0也可以
3)靜態的Parcelable.Creator接口,本接口有兩個方法:
createFromParcel(Parcel in) 實現從in中創建出類的實例的功能
newArray(int size) 創建一個類型爲T,長度爲size的數組,僅一句話(return new T[size])即可。估計本方法是供外部類反序列化本類數組使用。
新建兩個類一個是Person.java實現Serializable接口,另一個Book.java實現Parcelable接口,代碼分別如下:
Person.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import
java.io.Serializable; 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; } } |
Book.java
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
|
import
android.os.Parcel; import
android.os.Parcelable; public
class
Book implements
Parcelable { private
String bookName; private
String author; private
int
publishTime; 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
getPublishTime() { return
publishTime; } public
void
setPublishTime( int
publishTime) { this .publishTime
= publishTime; } public
static
final
Parcelable.Creator<Book> CREATOR = new
Creator<Book>() { public
Book createFromParcel(Parcel source) { Book
mBook = new
Book(); mBook.bookName
= source.readString(); mBook.author
= source.readString(); mBook.publishTime
= source.readInt(); return
mBook; } public
Book[] newArray( int
size) { return
new
Book[size]; } }; public
int
describeContents() { return
0 ; } public
void
writeToParcel(Parcel parcel, int
flags) { parcel.writeString(bookName); parcel.writeString(author); parcel.writeInt(publishTime); } } |
下面還後一個demo
第一步:新建一個Android工程命名爲ObjectTranDemo(類比較多哦!)目錄結構如下圖:
第二步:修改main.xml佈局文件(這裏我增加了兩個按鈕)代碼如下
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Welcome to Mr wei's blog."
- />
- <Button
- android:id="@+id/button1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Serializable"
- />
- <Button
- android:id="@+id/button2"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Parcelable"
- />
- </LinearLayout>
第三步:新建兩個類一個是Person.java實現Serializable接口,另一個Book.java實現Parcelable接口,代碼分別如下:
Person.java:
- package com.tutor.objecttran;
- import java.io.Serializable;
- 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;
- }
- }
Book.java:
- package com.tutor.objecttran;
- import android.os.Parcel;
- import android.os.Parcelable;
- public class Book implements Parcelable {
- private String bookName;
- private String author;
- private int publishTime;
- 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 getPublishTime() {
- return publishTime;
- }
- public void setPublishTime(int publishTime) {
- this.publishTime = publishTime;
- }
- public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
- public Book createFromParcel(Parcel source) {
- Book mBook = new Book();
- mBook.bookName = source.readString();
- mBook.author = source.readString();
- mBook.publishTime = source.readInt();
- return mBook;
- }
- public Book[] newArray(int size) {
- return new Book[size];
- }
- };
- public int describeContents() {
- return 0;
- }
- public void writeToParcel(Parcel parcel, int flags) {
- parcel.writeString(bookName);
- parcel.writeString(author);
- parcel.writeInt(publishTime);
- }
- }
第四步:修改ObjectTranDemo.java,並且新建兩個Activity,一個是ObjectTranDemo1.java,別一個是ObjectTranDemo2.java.分別用來顯示Person對像數據,和Book對象數據:,代碼分別如下:
ObjectTranDemo.java:
- package com.tutor.objecttran;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class ObjectTranDemo extends Activity implements OnClickListener {
- private Button sButton,pButton;
- public final static String SER_KEY = "com.tutor.objecttran.ser";
- public final static String PAR_KEY = "com.tutor.objecttran.par";
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- //我的一貫作風呵呵
- public void setupViews(){
- sButton = (Button)findViewById(R.id.button1);
- pButton = (Button)findViewById(R.id.button2);
- sButton.setOnClickListener(this);
- pButton.setOnClickListener(this);
- }
- //Serializeable傳遞對象的方法
- public void SerializeMethod(){
- Person mPerson = new Person();
- mPerson.setName("frankie");
- mPerson.setAge(25);
- Intent mIntent = new Intent(this,ObjectTranDemo1.class);
- Bundle mBundle = new Bundle();
- mBundle.putSerializable(SER_KEY,mPerson);
- mIntent.putExtras(mBundle);
- startActivity(mIntent);
- }
- //Pacelable傳遞對象方法
- public void PacelableMethod(){
- Book mBook = new Book();
- mBook.setBookName("Android Tutor");
- mBook.setAuthor("Frankie");
- mBook.setPublishTime(2010);
- Intent mIntent = new Intent(this,ObjectTranDemo2.class);
- Bundle mBundle = new Bundle();
- mBundle.putParcelable(PAR_KEY, mBook);
- mIntent.putExtras(mBundle);
- startActivity(mIntent);
- }
- //銨鈕點擊事件響應
- public void onClick(View v) {
- if(v == sButton){
- SerializeMethod();
- }else{
- PacelableMethod();
- }
- }
- }
ObjectTranDemo1.java:
- package com.tutor.objecttran;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class ObjectTranDemo1 extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView mTextView = new TextView(this);
- Person mPerson = (Person)getIntent().getSerializableExtra(ObjectTranDemo.SER_KEY);
- mTextView.setText("You name is: " + mPerson.getName() + "/n"+
- "You age is: " + mPerson.getAge());
- setContentView(mTextView);
- }
- }
ObjectTranDemo2.java:
- package com.tutor.objecttran;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class ObjectTranDemo2 extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView mTextView = new TextView(this);
- Book mBook = (Book)getIntent().getParcelableExtra(ObjectTranDemo.PAR_KEY);
- mTextView.setText("Book name is: " + mBook.getBookName()+"/n"+
- "Author is: " + mBook.getAuthor() + "/n" +
- "PublishTime is: " + mBook.getPublishTime());
- setContentView(mTextView);
- }
- }
第五步:比較重要的一步啦,修改AndroidManifest.xml文件(將兩個新增的Activity,ObjectTranDemo1,ObjectTranDemo2)申明一下代碼如下(第14,15行):
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.tutor.objecttran"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".ObjectTranDemo"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".ObjectTranDemo1"></activity>
- <activity android:name=".ObjectTranDemo2"></activity>
- </application>
- <uses-sdk android:minSdkVersion="7" />
- </manifest>