皮皮网
皮皮网

【海南彩源码】【marathon 源码】【soaoffice 源码】android parcel 源码

来源:vim .swp 源码泄漏 发表时间:2024-11-26 08:17:08

1.Android中的Parcelable详解
2.Android Parcelable和Serializable的区别,androidparcelable
3.Android系统中Parcelable和Serializable的区别

android parcel 源码

Android中的Parcelable详解

       在Android中,我们常常需要在不同组件之间传递数据。Bundle对象就是用于这种场景的一个工具,通过Bundle.putXXX(KEY,海南彩源码 VALUE)方法,可以存放基本数据类型和封装类型。但当需要传递复杂对象,如自定义的类实例时,单纯使用Bundle可能不够高效或者实现起来较为繁琐。这时,就需要使用Parcelable接口。

       实现Parcelable接口相比实现Serializable接口更为推荐,marathon 源码因为Parcelable接口提供了更高效的数据传输方式。下面通过一个简单的例子来说明如何实现Parcelable接口。

       首先定义一个对象包含一个属性mData。我们需要在类中实现Parcelable接口,并重写getParcelables和describeContents方法。soaoffice 源码getParcelables方法用于获取需要保存到Parcel对象中的字段数组,而describeContents方法用于描述Parcel的当前状态。

       在需要传递的对象中,通过调用Parcelable接口提供的方法,我们可以将这个对象序列化为Parcel对象。showmodaldialog 源码在接收端,再从Parcel对象反序列化回原来的对象。这个过程避免了反序列化时的类型转换,使得数据传输更加高效。

       实现Parcelable接口的opendaylight源码效率对比于实现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。

相关栏目:焦点