1.Android中的Parcelable详解
2.Android ParcelableåSerializableçåºå«ï¼androidparcelable
3.Androidç³»ç»ä¸ParcelableåSerializableçåºå«
Android中的Parcelable详解
在Android中,我们常常需要在不同组件之间传递数据。Bundle对象就是用于这种场景的一个工具,通过Bundle.putXXX(KEY,源码丢失只有class VALUE)方法,可以存放基本数据类型和封装类型。但当需要传递复杂对象,如自定义的类实例时,单纯使用Bundle可能不够高效或者实现起来较为繁琐。这时,就需要使用Parcelable接口。
实现Parcelable接口相比实现Serializable接口更为推荐,日源码分发源码因为Parcelable接口提供了更高效的数据传输方式。下面通过一个简单的例子来说明如何实现Parcelable接口。
首先定义一个对象包含一个属性mData。我们需要在类中实现Parcelable接口,并重写getParcelables和describeContents方法。淘宝客源码网站源码getParcelables方法用于获取需要保存到Parcel对象中的字段数组,而describeContents方法用于描述Parcel的当前状态。
在需要传递的对象中,通过调用Parcelable接口提供的方法,我们可以将这个对象序列化为Parcel对象。挖矿源码GEC源码在接收端,再从Parcel对象反序列化回原来的对象。这个过程避免了反序列化时的类型转换,使得数据传输更加高效。
实现Parcelable接口的app源码像网站源码效率对比于实现Serializable接口主要体现在反序列化阶段,Parcelable的反序列化过程直接从Parcel对象中读取数据,而Serializable的反序列化过程需要通过Java的反射机制,这使得Parcelable在数据传输效率上优于Serializable。
在使用Parcelable时,需要在需要传递的类中定义一个静态内部类,这个内部类继承自Parcelable,并且需要实现一个静态final的静态方法CREATOR。这个方法用于从Parcel对象中反序列化出原对象。如果尝试修改CREATOR的名称,程序将会报错。因此,要确保在定义CREATOR时使用正确的名称。
总结而言,对于需要在Android应用中高效地传递复杂对象的情况,实现Parcelable接口是更好的选择。通过定义CREATOR,我们可以方便地将对象反序列化回原状态,同时避免了复杂的类型转换,提高了数据传输的效率。
Android ParcelableåSerializableçåºå«ï¼androidparcelable
ParcelableåSerializableçä½ç¨ãæçãåºå«åéæ©:
1ãä½ç¨
Serializableçä½ç¨æ¯ä¸ºäºä¿å对象çå±æ§å°æ¬å°æ件ãæ°æ®åºãç½ç»æµãrmi以æ¹ä¾¿æ°æ®ä¼ è¾ï¼å½ç¶è¿ç§ä¼ è¾å¯ä»¥æ¯ç¨åºå çä¹å¯ä»¥æ¯ä¸¤ä¸ªç¨åºé´çãèAndroidçParcelableç设计åè¡·æ¯å 为Serializableæçè¿æ ¢ï¼ä¸ºäºå¨ç¨åºå ä¸åç»ä»¶é´ä»¥åä¸åAndroidç¨åºé´(AIDL)é«æçä¼ è¾æ°æ®è设计ï¼è¿äºæ°æ®ä» å¨å åä¸åå¨ï¼Parcelableæ¯éè¿IBinderéä¿¡çæ¶æ¯çè½½ä½ã
ä»ä¸é¢ç设计ä¸æ们就å¯ä»¥çåºä¼å£äºã
2ãæçåéæ©
Parcelableçæ§è½æ¯Serializable好ï¼å¨å åå¼éæ¹é¢è¾å°ï¼æ以å¨å åé´æ°æ®ä¼ è¾æ¶æ¨è使ç¨Parcelableï¼å¦activityé´ä¼ è¾æ°æ®ï¼èSerializableå¯å°æ°æ®æä¹ åæ¹ä¾¿ä¿åï¼æ以å¨éè¦ä¿åæç½ç»ä¼ è¾æ°æ®æ¶éæ©Serializableï¼å 为androidä¸åçæ¬Parcelableå¯è½ä¸åï¼æ以ä¸æ¨è使ç¨Parcelableè¿è¡æ°æ®æä¹ å
3ãç¼ç¨å®ç°
对äºSerializableï¼ç±»åªéè¦å®ç°Serializableæ¥å£ï¼å¹¶æä¾ä¸ä¸ªåºååçæ¬id(serialVersionUID)å³å¯ãèParcelableåéè¦å®ç°writeToParcelãdescribeContentså½æ°ä»¥åéæçCREATORåéï¼å®é ä¸å°±æ¯å°å¦ä½æå å解å çå·¥ä½èªå·±æ¥å®ä¹ï¼èåºååçè¿äºæä½å®å ¨ç±åºå±å®ç°ã
Parcelableçä¸ä¸ªå®ç°ä¾åå¦ä¸
[java] view plaincopy
public class MyParcelable implements Parcelable {
private int mData;
private String mStr;
public int describeContents() {
return 0;
}
// åæ°æ®è¿è¡ä¿å
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
out.writeString(mStr);
}
// ç¨æ¥å建èªå®ä¹çParcelableç对象
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
// 读æ°æ®è¿è¡æ¢å¤
private MyParcelable(Parcel in) {
mData = in.readInt();
mStr = in.readString();
}
}
ä»ä¸é¢æ们å¯ä»¥çåºParcelçåå ¥å读åºé¡ºåºæ¯ä¸è´çãå¦æå ç´ æ¯list读åºæ¶éè¦å newä¸ä¸ªArrayListä¼ å ¥ï¼å¦åä¼æ¥ç©ºæéå¼å¸¸ãå¦ä¸ï¼
list = new ArrayList<String>();
in.readStringList(list);
PS: å¨èªå·±ä½¿ç¨æ¶ï¼readæ°æ®æ¶è¯¯å°åé¢intæ°æ®å½ä½long读åºï¼ç»æåé¢ç顺åºéä¹±ï¼æ¥å¦ä¸å¼å¸¸ï¼å½ç±»å段è¾å¤æ¶å¡å¿ ä¿æåå ¥å读åçç±»åå顺åºä¸è´ã
- ::.: E/AndroidRuntime(): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@ed: Unmarshalling unknown type code at offset
4ãé«çº§åè½ä¸
Serializableåºååä¸ä¿åéæåéï¼å¯ä»¥ä½¿ç¨Transientå ³é®å对é¨åå段ä¸è¿è¡åºååï¼ä¹å¯ä»¥è¦çwriteObjectãreadObjectæ¹æ³ä»¥å®ç°åºååè¿ç¨èªå®ä¹
Androidç³»ç»ä¸ParcelableåSerializableçåºå«
两ç§é½æ¯ç¨äºæ¯æåºååãååºååè¯æä½ï¼ä¸¤è æ大çåºå«å¨äºåå¨åªä»çä¸åï¼Serializable使ç¨IO读ååå¨å¨ç¡¬çä¸ï¼èParcelableæ¯ç´æ¥å¨å åä¸è¯»åï¼å¾ææ¾å åç读åé度é常大äºIO读åï¼æ以å¨Androidä¸é常ä¼å éæ©Parcelableãå¨Androidä¸å®ç°Parcelableæ¥å£çç±»å¯ä»¥æ¯æåºåä¸ååºååï¼ä»¥ä¸æ¯ä¸ä¸ªå®ç°ç举ä¾ï¼1. å®ç°Parcelableæ¥å£2. æ·»å å®ä½å±æ§3. è¦åwriteToParcel(Parcel dest, int flags)æ¹æ³ï¼æå®åå ¥Parcelç±»çæ°æ®ã4. å建Parcelable.Creatoréæ对象ï¼æ两个æ¹æ³createFromParcel(Parcel in)ä¸newArray(int size)ï¼åè æå®å¦ä½ä»Parcelä¸è¯»ååºæ°æ®å¯¹è±¡ï¼åè å建ä¸ä¸ªæ°ç»ã5. è¦ådescribeContentsæ¹æ³ï¼é»è®¤è¿å0ã