Intent傳遞對象之Serializable和Parcelable的區(qū)別
Intent在不同的組件中傳遞對象數(shù)據(jù)的應用非常普遍,大家都知道在intent傳遞對象的方法有兩種:1、實現(xiàn)Serializable接口、2、實現(xiàn)Parcelable接口。
Android中Intent傳遞對象的兩種方法Serializable,Parcelable請點擊了解詳情。
為什么要將對象序列化?
1、永久性保存對象,保存對象的字節(jié)序列到本地文件中;
2、用過序列化對象在網絡中傳遞對象;
3、通過序列化對象在進程間傳遞對象。
1、實現(xiàn)Serializable接口
Serializable的作用是將數(shù)據(jù)對象存入字節(jié)流當中,在需要時重新生成對象,主要應用是利用外部存儲設備保存對象狀態(tài),以及通過網絡傳輸對象等。
implements Serializable接口的的作用就是給對象打了一個標記,系統(tǒng)會自動將其序列化。
案例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、實現(xiàn)Parcelable接口
1)為什么要實現(xiàn)Parfcelable接口來實現(xiàn)在Intent中傳遞對象?
a、在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable類。
b、Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
注意:Parcelable不能使用在將數(shù)據(jù)存儲在磁盤上的情況,因為Parcelable不能很好的保存數(shù)據(jù)的持續(xù)性在外界有變化的情況下。因此在這種情況下,建議使用Serializable
2) Android中的新的序列化機制
在Android系統(tǒng)中,針對內存受限的移動設備,因此對性能要求更高,Android系統(tǒng)采用了新的IPC(進程間通信)機制,要求使用性能更出色的對象傳輸方式。因此Parcel類被設計出來,其定位就是輕量級的高效的對象序列化和反序列化機制。
Parcel的序列化和反序列化的讀寫全是在內存中進行,所以效率比JAVA序列化中使用外部存儲器會高很多。
Parcel類
就應用程序而言,在常使用Parcel類的場景就是在Activity間傳遞數(shù)據(jù)。在Activity間使用Intent傳遞數(shù)據(jù)的時候,可以通過Parcelable機制傳遞復雜的對象。
Parcel機制:本質上把它當成一個Serialize就可以了。只是Parcel的對象實在內存中完成的序列化和反序列化,利用的是連續(xù)的內存空間,因此更加高效。
案例:
步驟1:自定義實體類,實現(xiàn)Parcelable接口,重寫其兩個方法。
步驟2:該實體類必須添加一個常量CREATOR(名字大小寫都不能使其他的),該常量必須實現(xiàn)Parcelable的內部接口:Parcelable.Creator,并實現(xiàn)該接口中的兩個方法。
User.java如下:
package com.example.intent_object; import android.os.Parcel; import android.os.Parcelable; public class User implements Parcelable { public String name; public int age; // 必須要創(chuàng)建一個名叫CREATOR的常量。 public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source); } //重寫createFromParcel方法,創(chuàng)建并返回一個獲得了數(shù)據(jù)的user對象 @Override public User[] newArray(int size) { return new User[size]; } }; @Override public String toString() { return name + ":" + age; } // 無參數(shù)構造器方法,供外界創(chuàng)建類的實例時調用 public User() { } // 帶參構造器方法私用化,本構造器僅供類的方法createFromParcel調用 private User(Parcel source) { name = source.readString(); age = source.readInt(); } @Override public int describeContents() { return 0; } // 將對象中的屬性保存至目標對象dest中 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } //省略getter/setter }
其他代碼:
Bundle bundle = new Bundle(); bundle.putParcelable("user", user); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtras(bundle); Intent intent = getIntent(); Bundle bun = intent.getExtras(); User user = bun.getParcelable("user"); System.out.println(user);
以上內容就是本文給大家介紹的Intent傳遞對象之Serializable和Parcelable的區(qū)別,下面給大家詳解Android中Intent傳遞對象的兩種方法Serializable,Parcelable,感興趣的朋友可以點擊了解詳情。
相關文章
Android?獲取手機已安裝的應用列表實現(xiàn)詳解
這篇文章主要介紹了Android?獲取手機已安裝的應用列表的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08一文帶你搞清楚Android游戲發(fā)行切包資源ID那點事
這篇文章主要介紹了Android 解決游戲發(fā)行切包資源ID的一些問題,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下2023-05-05Android開發(fā)中Google為什么不讓用Handler的runWithScissors()
這篇文章主要介紹了Android開發(fā)中Google為什么不讓用Handler的runWithScissors(),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09