美文网首页
Parcelable 接口介绍

Parcelable 接口介绍

作者: 多仔百事宅 | 来源:发表于2021-05-07 10:34 被阅读0次

    只要实现了 Parcelable 接口,一个类的对象就可以实现序列化并可以通过 Intent 和 Binder 传递。

    使用示例

    import android.os.Parcel;import android.os.Parcelable;
    
    public class User implements Parcelable {
            private int userId;
    
            protected User(Parcel in) {
                userId = in.readInt();
            }
    
            public static final Creator<User> CREATOR = new Creator<User>() {
                @Override
                public User createFromParcel(Parcel in) {
                    return new User(in);
                }
    
                @Override
                public User[] newArray(int size) {
                    return new User[size];
                }
            };
    
            @Override
            public int describeContents() {
                return 0;
            }
    
            @Override
            public void writeToParcel(Parcel dest, int flags) {
                dest.writeInt(userId);
            }
    
            public int getUserId() {
                return userId;
            }
    }
    

    方法说明

    Parcel 内部包装了可序列化的数据,可以在 Binder 中自由传输。序列化功能由 writeToParcel 方法完成,最终是通过 Parcel 中的一系列 write 方法完成。反序列化功能由 CREATOR 来完成,通过 Parcel 的一系列 read 方法来完成反序列化过程。

    方法名

    createFromParcel(Parcel in)

    功能:从序列化后的对象中创建原始对象

    方法名

    newArray(int size)

    功能:创建指定长度的原始对象数组

    方法名

    User(Parcel in)

    功能:从序列化后的对象中创建原始对象

    方法名

    writeToParcel(Parcel dest, int flags)

    功能:将当前对象写入序列化结构中,其中 flags 标识有两种值:0 或者 1;为 1 时标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为 0

    方法名

    describeContents

    功能:返回当前对象的内容描述。如果含有文件描述符,返回 1,否则返回 0,几乎所有情况都返回 0

    Parcelable 与 Serializable 对比

    • Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接在内存中读写
    • Serializable 会使用反射,序列化和反序列化过程需要大量 I/O 操作, Parcelable 自已实现封送和解封(marshalled &unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多

    相关文章

      网友评论

          本文标题:Parcelable 接口介绍

          本文链接:https://www.haomeiwen.com/subject/tmdsdltx.html