Parcel 是什么
- Parcel 是用于对象序列化和反序列化的一个类。通俗地说,它是一种轻量级的容器,常用于打包对象的数据(如基本类型和其他 Parcelable 对象),使它们能够在不同的组件(如 Activity、Service 等)之间传递
Parcel的主要作用
- 不同的组件(如 Activity、Service)之间需要传递数据。例如,在一个 Activity 启动另一个 Activity 时,可能需要传递一些数据,如字符串、整数或者自定义对象。Parcel 可以以一种非常高效的方式序列化这些数据,从而可以通过 Intent 等机制传递它们
Parcel 的工作原理
- Parcel 的工作机制:它将数据序列化为二进制格式,然后将其打包到一个 Parcel 对象中。这个对象可以传递给其他组件,其他组件接收到后再将数据从二进制格式反序列化回来,恢复成原始的对象
使用 Parcel 的好处
- Parcel 的效率非常高,因为它不像 Serializable 那样需要进行大量的反射操作。Parcel 直接处理原始数据,因此更建议使用
Parcel 常用方法
parcel.write...()
方法:用于将数据写入 Parcel 对象。例如:parcel.writeInt(int val)
:将一个整数写入 Parcelparcel.writeString(String str)
:将一个字符串写入 Parcelparcel.writeParcelable(Parcelable p, int flags)
:将一个 Parcelable 对象写入 Parcel;flags 通常作为一个整数标记,很少使用
parcel.read...()
方法:用于从 Parcel 对象中读取数据。例如:parcel.readInt()
:从 Parcel 中读取一个整数parcel.readString()
:从 Parcel 中读取一个字符串parcel.readParcelable(ClassLoader classLoader)
:从 Parcel 中读取一个 Parcelable 对象
代码示例
-
假设有一个自定义对象 User,想要在两个 Activity 之间传递这个对象。需要将 User 对象序列化为 Parcel,然后传递给下一个 Activity
-
写入数据到 Parcel:
Parcel parcel = Parcel.obtain(); // 获取一个空的 Parcel 对象 User user = new User("Alice", 30); user.writeToParcel(parcel, 0); // 使用 User 类的 writeToParcel 方法将对象写入 Parcel parcel.setDataPosition(0); // 重置 Parcel 的数据位置,以便读取
-
从 Parcel 中读取数据:
User userFromParcel = User.CREATOR.createFromParcel(parcel); // 使用 CREATOR 从 Parcel 中创建 User 对象
-
总结
-
Parcel 是特有的类:专门用于高效地序列化和反序列化数据
-
Parcel 不进行类型检查:需要按照写入的顺序和类型来读取数据
-
比 Serializable 更高效:Parcel 是直接操作内存中的数据,没有额外的反射操作