Parcel简介
在IPC过程中,发送方可以使用Parcel提供的写方法,将待发送的数据以特定格式写入Parcel对象。接收方可以使用Parcel提供的读取方法从Parcel对象中读取特定格式的数据。
Parcel实例的默认容量为200KB。如果您想要更多或更少,请使用setCapacity(int)更改它。
注意:只有以下数据类型的数据才能写入或从包裹中读取: byte, byteArray, short, shortArray, int, intArray, long, longArray, float, floatArray, double, doubleArray, boolean, booleanArray, char, charArray, String, StringArray、 PlainBooleanArray, Serializable, Sequenceable, 和 SequenceableArray。
方法介绍
2.1 addAppClassLoader(ClassLoader newClassLoader)public void addAppClassLoader(ClassLoader newClassLoader)添加第三方ClassLoader用于实例初始化。如果您需要封装或取消封装自定义序列化数据,请添加您自己的ClassLoader。
2.2 writeSequenceablepublic final void writeSequenceable(Sequenceable val)将可序列化对象写入Parcel实例。其余的方法参考文档Parcel资料
封装Sequenceable实体类我们参考Sequenceable资料

动手实践
今天将一个Sequenceable的集合存到Parcel然后读取出来
4.1 新建两个类 A类用户存放具体属性,B类用于存放A的实体类集合
A类代码如下
- public static class A implements Sequenceable {
- private int a;
-
- private int b;
-
- private int c;
-
- public A() {
- this(0, 0, 0);
- }
-
- public A(int a, int b, int c) {
- this.a = a;
- this.b = b;
- this.c = c;
- }
-
- @Override
- public boolean hasFileDescriptor() {
- return false;
- }
-
- @Override
- public boolean marshalling(Parcel out) {
- out.writeInt(a);
- out.writeInt(b);
- out.writeInt(c);
- return true;
- }
-
- @Override
- public boolean unmarshalling(Parcel in) {
- a = in.readInt();
- b = in.readInt();
- c = in.readInt();
- return true;
- }
-
- public A createFromParcel(Parcel in) {
- A instance = new A();
- instance.unmarshalling(in);
- return instance;
- }
- };
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- A a1 = (A) o;
- return a == a1.a &&
- b == a1.b &&
- c == a1.c;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(a, b, c);
- }
-
- @Override
- public String toString() {
- return "A{" +
- "a=" + a +
- ", b=" + b +
- ", c=" + c +
- '}';
- }
4.2 B类用于存放A的实体类集合,代码如下
- public static class B implements Sequenceable {
- private List list;
- private B() {
- }
-
- this.list = list;
- }
-
- @Override
- public boolean hasFileDescriptor() {
- return false;
- }
-
- @Override
- public boolean marshalling(Parcel out) {
- out.writeSequenceableList(list);
- return true;
- }
-
- @Override
- public boolean unmarshalling(Parcel in) {
- in.addAppClassLoader(getClass().getClassLoader());
- list = in.readSequenceableList(A.class);
- return true;
- }
-
- public static final Sequenceable.Producer PRODUCER = new Sequenceable.Producer() {
- public B createFromParcel(Parcel in) {
- B instance = new B();
- instance.unmarshalling(in);
- return instance;
- }
- };
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- B b = (B) o;
- return Objects.equals(list, b.list);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(list);
- }
- }
需要注意的是我们需要调用addAppClassLoader方法,这个地方比较容易出错,如下图

4.3新建abilitySlice ,然后在xml写一个控件用于存读Parcel中数据,xml代码如下
- <DirectionalLayout
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:orientation="vertical">
-
- <Text
- ohos:id="$+id:bt1"
- ohos:height="100vp"
- ohos:background_element="#Ed6262"
- ohos:width="match_parent"
- ohos:text_alignment="center"
- ohos:text_size="30fp"
- ohos:text_color="#ffffff"
- ohos:text="存储数据"/>
- <Text
- ohos:top_margin="10vp"
- ohos:id="$+id:Result"
- ohos:height="100vp"
- ohos:multiple_lines="true"
- ohos:width="match_parent"
- ohos:text_alignment="center|left"
- ohos:text_size="20fp"
- ohos:text_color="#ed6262"
- />
- DirectionalLayout>
4.4实现点击按钮事件,然后存读数据,代码如下
- findComponentById(ResourceTable.Id_bt1).setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- A a = new A(1, 2, 3);
- A a2 = new A(2, 2, 3);
- A a3 = new A(3, 2, 3);
- list.add(a);
- list.add(a2);
- list.add(a3);
- B b = new B(list);
- Parcel parcel = Parcel.create();
- parcel.writeSequenceable(b);
- B b1 = new B();
- parcel.readSequenceable(b1);
- StringBuilder stringBuilder=new StringBuilder();
- if (b1.list.size() > 0) {
- for (int i = 0; i < b1.list.size(); i++) {
- stringBuilder.append(" b1.list====>" + b1.list.get(i).toString());
- stringBuilder.append("\n");
- }
- }
- mResult.setText(stringBuilder.toString());
- }
- });
运行效果
全部代码如下
5.1xml
- xmlns:ohos="http://schemas.huawei.com/res/ohos"
- ohos:height="match_parent"
- ohos:width="match_parent"
- ohos:orientation="vertical">
-
-
- ohos:id="$+id:bt1"
- ohos:height="100vp"
- ohos:background_element="#Ed6262"
- ohos:width="match_parent"
- ohos:text_alignment="center"
- ohos:text_size="30fp"
- ohos:text_color="#ffffff"
- ohos:text="存储数据"/>
-
- ohos:top_margin="10vp"
- ohos:id="$+id:Result"
- ohos:height="100vp"
- ohos:multiple_lines="true"
- ohos:width="match_parent"
- ohos:text_alignment="center|left"
- ohos:text_size="20fp"
- ohos:text_color="#ed6262"
- />
5.2 java 代码
- package com.harmony.alliance.mydemo.slice;
-
- import com.harmony.alliance.mydemo.ResourceTable;
- import ohos.aafwk.ability.AbilitySlice;
- import ohos.aafwk.content.Intent;
- import ohos.agp.components.Component;
- import ohos.agp.components.Text;
- import ohos.utils.Parcel;
- import ohos.utils.Sequenceable;
-
- import java.util.*;
-
- public class ParcelTestSlice extends AbilitySlice {
- private Text mResult;
- @Override
- protected void onStart(Intent intent) {
- super.onStart(intent);
- setUIContent(ResourceTable.Layout_slice_main2);
- mResult= (Text) findComponentById(ResourceTable.Id_Result);
- findComponentById(ResourceTable.Id_bt1).setClickedListener(new Component.ClickedListener() {
- @Override
- public void onClick(Component component) {
- A a = new A(1, 2, 3);
- A a2 = new A(2, 2, 3);
- A a3 = new A(3, 2, 3);
- list.add(a);
- list.add(a2);
- list.add(a3);
- B b = new B(list);
- Parcel parcel = Parcel.create();
- parcel.writeSequenceable(b);
- B b1 = new B();
- parcel.readSequenceable(b1);
- StringBuilder stringBuilder=new StringBuilder();
- if (b1.list.size() > 0) {
- for (int i = 0; i < b1.list.size(); i++) {
- stringBuilder.append(" b1.list====>" + b1.list.get(i).toString());
- stringBuilder.append("\n");
- }
- }
- mResult.setText(stringBuilder.toString());
- }
- });
-
- }
-
-
-
- public static class B implements Sequenceable {
- private List list;
-
- private B() {
- }
-
- this.list = list;
- }
-
- @Override
- public boolean hasFileDescriptor() {
- return false;
- }
-
- @Override
- public boolean marshalling(Parcel out) {
- out.writeSequenceableList(list);
- return true;
- }
-
- @Override
- public boolean unmarshalling(Parcel in) {
- in.addAppClassLoader(getClass().getClassLoader());
- list = in.readSequenceableList(A.class);
- return true;
- }
-
- public static final Sequenceable.Producer PRODUCER = new Sequenceable.Producer() {
- public B createFromParcel(Parcel in) {
- B instance = new B();
- instance.unmarshalling(in);
- return instance;
- }
- };
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- B b = (B) o;
- return Objects.equals(list, b.list);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(list);
- }
- }
-
- public static class A implements Sequenceable {
- private int a;
- private int b;
- private int c;
-
- public A() {
- this(0, 0, 0);
- }
-
- public A(int a, int b, int c) {
- this.a = a;
- this.b = b;
- this.c = c;
- }
-
- @Override
- public boolean hasFileDescriptor() {
- return false;
- }
-
- @Override
- public boolean marshalling(Parcel out) {
- out.writeInt(a);
- out.writeInt(b);
- out.writeInt(c);
- return true;
- }
-
- @Override
- public boolean unmarshalling(Parcel in) {
- a = in.readInt();
- b = in.readInt();
- c = in.readInt();
- return true;
- }
-
- public A createFromParcel(Parcel in) {
- A instance = new A();
- instance.unmarshalling(in);
- return instance;
- }
- };
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- A a1 = (A) o;
- return a == a1.a &&
- b == a1.b &&
- c == a1.c;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(a, b, c);
- }
-
- @Override
- public String toString() {
- return "A{" +
- "a=" + a +
- ", b=" + b +
- ", c=" + c +
- '}';
- }
- }
- }
5.3效果如下

更多相关学习资料:
https://developer.huawei.com/consumer/cn/forum/topic/0201785060053960095?fid=0101562279236410779?ha_source=zzh
-
相关阅读:
WebDAV之葫芦儿·派盘+静读天下
什么是数字化存在?数字化转型要先从数字化存在开始
BloomFilter:布隆过滤器和Redis缓存穿透
【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性-续
CVPR2022 | 长期行动预期的Future Transformer
Opera 浏览器
gitlab之cicd的gitlab-runner集成-dockerfile构建环境
基于JAVA临沂旅游咨询系统计算机毕业设计源码+数据库+lw文档+系统+部署
基于 SpringBoot 的大学生体质测试管理系统,附源码
P1039 [NOIP2003 提高组] 侦探推理
-
原文地址:https://blog.csdn.net/weixin_44708240/article/details/125807237