android的parcel序列化的逻辑

  Parcel,翻译过来是“打包”的意思。打包干什么呢?是为了序列化。

    如果要在进程之间传递一个整数,很简单,直接传就是行了;如果要传一个字符串,就稍微复杂了点:需先分配一块可以容纳字符串的内存,然后将字符串复制到内存中,再传递(新手可能问:为啥不直接把字符串的引用传过去呢?学过C/C++的地球人都知道:进程有自己的内存地址空间,一个进程中的1000地址可能在另一个进程中是100000,java对象的引用跟本上还是内存地址);再如果要传递一个类的实例呢?也是先为类分配内存,然后复制一份再传递可以吗?我认为不可以,我至少可以找到一个理由:类中成员除了属性还有方法,即使属性能完整传过去,但还有方法呢?方法是独立于类对象存在的,所以到另一个进程中再引用同一个方法就要出错了,还是因为独立地址空间的原因。

    Android开发中,很经常在各activity之间传递数据,而跟据Android的设计架构,即使同一个程序中的Activity都不一定运行在同一个进程中,所以处理数据传递时你不能老假设两个activity都运行于同一进程,那么只能按进程间传递数据来处理,使之具有最广泛的适应性。

  那么到底如何在进程之间传递类对象呢?简单来说可以这样做:在进程A中把类中的非默认值的属性和类的唯一标志打成包(这就叫序列化),把这个包传递到进程B,进程B接收到包后,跟据类的唯一标志把类对象创建出来,然后把传来的属性值设置给新对象,这样进程A和进程B中就包含了两个完全一样的类对象。

       在Android中,Parcelable接口提供了一种高效的序列化机制,主要用于组件间的数据传递,如在ActivityFragmentService之间,或者通过IntentAIDL(Android Interface Definition Language)跨进程传递数据。相比于Serializable接口,Parcelable提供了更好的性能和控制。

Parcelable的核心逻辑集中在两个方法上:writeToParcelreadFromParcel,以及一个静态的CREATOR字段,它们分别用于序列化和反序列化数据。

1. 实现Parcelable接口

要使一个类成为Parcelable,需要做以下几步:

  • 实现Parcelable接口。
  • 实现writeToParcel方法,用于将对象状态写入Parcel
  • 实现describeContents方法,通常返回0表示没有特殊的内容描述符。
  • 提供一个静态的CREATOR字段,用于从Parcel中恢复对象。

2. writeToParcel方法

这个方法用于将对象的状态写入Parcel对象中。Parcel提供了一系列的方法来写入各种类型的数据,如writeInt(), writeString(), writeParcelable()等。开发者需要根据对象的成员变量类型调用相应的Parcel方法。

Java
1@Override
2public void writeToParcel(Parcel dest, int flags) {
3    dest.writeString(this.someString);
4    dest.writeInt(this.someInt);
5    dest.writeParcelable(this.someParcelable, flags);
6}

3. describeContents方法

这个方法用于描述对象的内容,通常情况下,如果对象不包含特殊的文件描述符,那么这个方法应该返回0

Java

1@Override
2public int describeContents() {
3    return 0;
4}

4. CREATOR字段

CREATOR字段是一个Parcelable.Creator<T>类型的静态内部类,它包含了createFromParcelnewArray两个方法,用于从Parcel中创建对象的实例。

Java

1public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
2    @Override
3    public MyParcelable createFromParcel(Parcel in) {
4        return new MyParcelable(in);
5    }
6
7    @Override
8    public MyParcelable[] newArray(int size) {
9        return new MyParcelable[size];
10    }
11};

5. 反序列化过程

在反序列化过程中,CREATORcreateFromParcel方法被调用来从Parcel中恢复对象。

Java

1public MyParcelable(Parcel in) {
2    someString = in.readString();
3    someInt = in.readInt();
4    someParcelable = in.readParcelable(getClass().getClassLoader());
5}

6. 使用Parcelable序列化

当你想通过IntentParcelable数组传递Parcelable对象时,可以使用Intent.putExtra()方法,并指定Intent.PARCELABLE_TYPE作为类型标志。

Java

1Intent intent = new Intent();
2intent.putExtra("my_parcelable", myParcelableObject);

在接收端,你可以使用Intent.getParcelableExtra()来获取序列化的对象。

Java

1MyParcelable receivedObject = intent.getParcelableExtra("my_parcelable");

7. 性能优势

Parcelable之所以性能更高,是因为它避免了Serializable接口的深度复制和反射机制。Parcelable对象可以在内存中直接移动,无需进行昂贵的序列化和反序列化过程,这在需要频繁传递对象的场景下尤其重要。同时,Parcelable也允许开发者更精细地控制序列化过程,提高效率和兼容性。

以上就是Parcelable在Android中的序列化逻辑概述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值