文档管理中心
您当前正在浏览新版开发者文档中心,目录分类和层级有所调整。点击左侧当前文档分类名称前的“☰”图标,可切换文档分类。 了解新版目录
问题处理与运维开发与测试问题应用框架开发ArkTS语言方舟编程语言(ArkTS)ASON.parse生成的Sendable对象和@Sendable注解类的实例对象的差异

ASON.parse生成的Sendable对象和@Sendable注解类的实例对象的差异

问题现象

使用ArkTSUtils.ASON.parse生成的Sendable对象,和通过类(@Sendable装饰器)构造函数实例化出来的对象,有什么区别?

背景知识

ASON解析与生成:ASON工具提供了Sendable对象的序列化、反序列化能力。使用ASON.stringify方法可将对象转换为字符串,使用ASON.parse方法可将字符串转换为Sendable对象,从而实现对象在并发任务间的高性能引用传递。

解决方案

相同点:

  • 都是Sendable对象,可以跨线程通信。
  • 都可以获取和修改属性值,但是无法增加和删除。

不同点:ASON.parse生成的Sendable对象无法调用类成员方法。原因是使用ArkTSUtils.ASON.parse()解析JSON生成Sendable对象时,生成的仅是数据结构的副本,不会保留原始类的原型链和方法,所以无法调用方法。

收起
自动换行
深色代码主题
复制
  1. import { ArkTSUtils, lang, taskpool } from '@kit.ArkTS';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. @Sendable
  4. class TestClass {
  5. name: string = 'Bob';
  6. age: number = 18;
  7. city: string = 'ct';
  8. info() {
  9. this.age += 1;
  10. console.info(`name: ${this.name} age: ${this.age} city: ${this.city}`);
  11. }
  12. }
  13. @Concurrent
  14. function method(testClass: TestClass) {
  15. testClass.name = 'Cici';
  16. console.info('modify name to Cici');
  17. }
  18. @Entry
  19. @Component
  20. struct Index {
  21. build() {
  22. Column() {
  23. Button('ASON')
  24. .onClick(async () => {
  25. type ISendable = lang.ISendable;
  26. let jsonText = '{"name": "John", "age": 30, "city": "ct"}';
  27. let obj = ArkTSUtils.ASON.parse(jsonText) as ISendable;
  28. // 在线程中传递
  29. try {
  30. let task = new taskpool.Task(method, (obj as TestClass));
  31. await taskpool.execute(task);
  32. console.info((obj as TestClass).name); // 打印Cici
  33. } catch (e) {
  34. let err: BusinessError = e as BusinessError;
  35. console.error(`执行失败,${err.code}, ${err.message}`);
  36. }
  37. // 获取和修改属性值
  38. try {
  39. (obj as TestClass).name = 'Alice';
  40. console.info((obj as TestClass).name); // 打印Alice
  41. jsonText = ArkTSUtils.ASON.stringify(obj);
  42. console.info(`${jsonText}`); // 打印{"name":"Alice","age":30,"city":"ct"}
  43. } catch (e) {
  44. let err: BusinessError = e as BusinessError;
  45. console.error(`修改失败,${err.code}, ${err.message}`);
  46. }
  47. // 无法调用类成员方法
  48. try {
  49. (obj as TestClass).info();
  50. console.info('调用成功');
  51. } catch (e) {
  52. let err: BusinessError = e as BusinessError;
  53. console.error(`调用失败,${err.code}, ${err.message}`); // 无法调用,打印:调用失败,undefined, undefined is not callable
  54. }
  55. });
  56. }
  57. .height('100%')
  58. .width('100%')
  59. .justifyContent(FlexAlign.Center);
  60. }
  61. }