1. 程式人生 > >Serializable和Parcelable的簡單介紹

Serializable和Parcelable的簡單介紹

重新 出現 ray listen android lee long tag cti

  Serializable和Pacelable接口可以完成對象的序列化過程,當我們需要通過Intent和Binder傳輸數據時就需要使用Parcelable或者Serializable。

Serializable接口         Serializable是Java所提供的一個序列化的接口,它是一個空接口,為對象提供標準的序列化和反序列化操作。

public
class Person implements Serializable { private static final long serialVersionUID = 11347198374914134L; 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; } }

想要讓一個類實現序列化,只需要這個類實現Serializable接口並聲明一個serialVersionUID即可。實際上,這個serialVersionUID也不是必須的,但是不聲明會產生影響。serialVersionUID是用來輔助序列化的,原則上序列化後數據中的serialVersionUID只有和當前類的serialVersionUID相同才能夠正常的被反序列化。serialVersionUID的詳細工作機制是這樣的:序列化的時候系統會把當前類的serialVersionUID寫入序列化的文件中,當反序列化的時候系統會去檢測文件中的serialVersionUID,看它是否和當前類的serialVersionUID一致,一致說明序列化的類和當前類的版本相同,可以成功反序列化,否則說明當前類發生了改變,這個時候就無法正常序列化。當我們沒有手動指定serialVersionUID的值時系統會自動生成,當類結構發生改變,系統會重新計算當前類的serialVersionUID值。這時就可能出現反序列化失敗的情況,所以我們應盡量手動指定serialVersionUID值。

Parcelable接口

Pracelable是android中的序列化方式,因此更適合用在android平臺上。缺點是使用起來較為麻煩,不僅需要聲明,還需要實現其內部方法。但是它的效率很高。

 1 public class Book implements Parcelable {
 2 
 3     private String name;
 4     private String color;
 5 
 6     public Book(String name, String color){
 7         this.name = name;
 8         this.color = color;
 9     }
10 
11     public String getColor() {
12         return color;
13     }
14 
15     public void setColor(String color) {
16         this.color = color;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     protected Book(Parcel in) {
28         color = in.readString();
29         name = in.readString();
30     }
31 
32     @Override
33     public void writeToParcel(Parcel dest, int flags) {
34         dest.writeString(color);
35         dest.writeString(name);
36     }
37 
38     public static final Creator<Book> CREATOR = new Creator<Book>() {
39         @Override
40         public Book createFromParcel(Parcel in) {
41             return new Book(in);
42         }
43 
44         @Override
45         public Book[] newArray(int size) {
46             return new Book[size];
47         }
48     };
49 
50     @Override
51     public int describeContents() {
52         return 0;
53     }
54 }

使用serializable和parcelable傳遞數據

//使用serializable傳遞數據
        findViewById(R.id.btn_serializable).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                //傳遞方式一
                intent.putExtra("put_person", person);
                //傳遞方式二
                Bundle bundle = new Bundle();
                bundle.putSerializable("bundle_person", person);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });

        //使用parcelable傳遞數據
        findViewById(R.id.btn_parcelable).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, ThirdActivity.class);

                Book book = new Book("abc","yellow");

//                intent.putExtra("book", book);
                Bundle bundle = new Bundle();
                bundle.putParcelable("book",book);
                intent.putExtras(bundle);
                startActivity(intent);
            }
        });
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView tv_content = (TextView) findViewById(R.id.tv_content);

        Intent intent = getIntent();
        //Person person = (Person) intent.getSerializableExtra("put_person");
        Person person = (Person) intent.getSerializableExtra("bundle_person");
        tv_content.setText("name:" + person.getName() + " age:" + person.getAge());
    }
}
public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);

        TextView tv_content = (TextView) findViewById(R.id.tv_content);

        Intent intent = getIntent();
        Book book = intent.getParcelableExtra("book");

        tv_content.setText("name:" + book.getName() + " coloe:" + book.getColor());
    }
}

Serializable和Parcelable的簡單介紹