鸿蒙多线程开发——Sendable对象的序列化与冻结操作
1、Sendable对象的序列化与反序列化
Sendable对象的简单介绍参考文章:鸿蒙多线程开发——线程间数据通信对象03(sendable)
与JSON对象的序列化和反序列化类似,Sendable对象的序列化和反序列化是通过ArkTs提供的ASON工具来完成。
与JSON类似,我们可以通过ASON.stringify方法将对象转换成字符串,也可以通过ASON.parse方法将字符串转成Sendable对象,以便此对象在并发任务间进行高性能引用传递。
需要注意的是:
ASON.parse默认生成的Sendable对象不支持增删属性。如果需要支持返回对象的布局可变,可以指定返回类型为MAP,此时会全部返回collections.Map对象,支持增删属性。
一个序列化(ASON.stringify)使用示例如下:
import { ArkTSUtils, collections } from '@kit.ArkTS';// ...let arr = new collections.Array(1, 2, 3);let str = ArkTSUtils.ASON.stringify(arr);console.info(str); // 期望输出: '[1,2,3]'
一个反序列化(ASON.parse)使用示例如下:
import { lang } from '@kit.ArkTS';import { ArkTSUtils, collections } from '@kit.ArkTS';type ISendable = lang.ISendable;let jsonText = '{"name": "John", "age": 30, "city": "ChongQing"}';let obj = ArkTSUtils.ASON.parse(jsonText) as ISendable;console.info((obj as object)?.["name"]); // 输出: 'John'console.info((obj as object)?.["age"]); // 输出: 30console.info((obj as object)?.["city"]); // 输出: 'ChongQing'
反序列化时,也可以额外传入Option字段,示例如下:
import { lang } from '@kit.ArkTS';import { ArkTSUtils, collections } from '@kit.ArkTS';type ISendable = lang.ISendable;let options: ArkTSUtils.ASON.ParseOptions = {bigIntMode: ArkTSUtils.ASON.BigIntMode.PARSE_AS_BIGINT,parseReturnType: ArkTSUtils.ASON.ParseReturnType.OBJECT,}let numberText = '{"largeNumber":112233445566778899}';let numberObj = ArkTSUtils.ASON.parse(numberText,undefined,options) as ISendable;console.info((numberObj as object)?.["largeNumber"]);// 期望输出: 112233445566778899
ASON工具提供了的两个序列化和反序列化接口,定义如下:
// 序列化ISendable对象stringify(value: ISendable | null | undefined): string// 反序列化ISendable对象parse(text: string, reviver?: Transformer, options?: ParseOptions): ISendable | null
parse函数还有两个可选参数:reviver、options。含义与定义介绍如下:
-
reviver?: Transformer
转换函数,传入该参数,可以用来修改解析生成的原始值。默认值是undefined。(目前只支持传入undefined)。Transformer类型定义如下:
// this:在解析的键值对所属的对象。key:属性名。value: 在解析的键值对d的值type Transformer = (this: ISendable, key: string, value: ISendable | undefined | null) => ISendable | undefined | null
-
options?: ParseOptions
解析的配置,传入该参数,可以用来控制解析生成的结果类型。默认值是undefined。ParseOptions类型定义如下:
struct ParseOptions {bigIntMode: BigIntMode; // 定义处理BigInt的模式。parseReturnType: ParseReturnType; // 定义解析结果的返回类型。}// 定义处理BigInt的模式枚举enum BigIntMode {DEFAULT = 0; // 不支持BigInt。PARSE_AS_BIGINT = 1; // 当整数小于-(2^53-1)或大于(2^53-1)时,解析为BigInt。ALWAYS_PARSE_AS_BIGINT = 2; // 所有整数都解析为BigInt。}enum ParseReturnType {OBJECT = 0; // 返回Sendable Object对象。}
2、Sendable对象冻结
Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能增删改属性,因此在多个并发实例间访问均不需要加锁,可以通过调用Object.freeze接口冻结对象。
使用示例如下:
👉🏻 step 1: 供ts文件封装Object.freeze方法。
// helper.tsexport function freezeObj(obj: any) {Object.freeze(obj);}
👉🏻 step 2: 通过调用freeze方法冻结对象,并将对象发送给子线程。
// Index.etsimport { freezeObj } from './helper';import { worker } from '@kit.ArkTS';@Sendableexport class GlobalConfig {// 一些配置属性与方法init() {// 初始化相关逻辑freezeObj(this); // 初始化完成后冻结当前对象}}@Entry@Componentstruct Index {build() {Column() {Text("Sendable freezeObj Test").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {let gConifg = new GlobalConfig();gConifg.init();const workerInstance = new worker.ThreadWorker('entry/ets/workers/Worker.ets', { name: "Worker1" });workerInstance.postMessage(gConifg);})}.height('100%').width('100%')}}
👉🏻 step 3: 子线程不加锁直接操作对象。
// Worker.etsimport { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';import { GlobalConfig } from '../pages/Index';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;workerPort.onmessage = (e: MessageEvents) => {let gConfig: GlobalConfig = e.data;// 使用gConfig对象}
相关文章:
鸿蒙多线程开发——Sendable对象的序列化与冻结操作
1、Sendable对象的序列化与反序列化 Sendable对象的简单介绍参考文章:鸿蒙多线程开发——线程间数据通信对象03(sendable) 与JSON对象的序列化和反序列化类似,Sendable对象的序列化和反序列化是通过ArkTs提供的ASON工具来完成。 与JSON类似࿰…...
nodepad配置c/c++ cmd快速打开创建项目文件
前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…...
【C++】读取数量不定的输入数据
读取数量不定的输入数据 似乎是一个很实用的东西? 问题: 我们如何对用户输入的一组数(事先不知道具体有多少个数)求和? 这需要不断读取数据直至没有新的输入为止。(所以我们的代码就是这样设计的&#x…...
ESC字符背后的故事(27 <> 033 | x1B ?)
ANSI不可见字符转义,正确的理解让记忆和书写变得丝滑惬意。 (笔记模板由python脚本于2024年11月26日 15:05:33创建,本篇笔记适合python 基础扎实的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free…...
基于NXP LS1043 OpenWRT智能交通边缘网关设计
0 引言 城市公共交通是与人们生产生活息息相关的重 要基础设施,是关系国计民生的社会公益事业。“城 市公共交通发展的十三五规划”明确指出:建设与移 动互联网深度融合的智能公交系统;推进“互联网 城市公交”发展;推进多元…...
绪论相关题目
1.在数据结构中,从逻辑上可以把数据结构分成( C)。 A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构 C. 线性结构和非线性结构 D. 内部结构和外部结构 2.在数据结构中,从存储结构上可以将之分为( B)。 A. 动态结构和静态结构 B. 顺序存储和非顺序存储 C. 紧凑结构和非紧…...
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译
中国科学院大学研究生学术英语读写教程 Unit7 Materials Science TextA 原文和翻译 Why Is the Story of Materials Really the Story of Civilisation? 为什么材料的故事实际上就是文明的故事? Mark Miodownik 1 Everything is made of something. Take away co…...
centos系列安装服务器时分区
服务器安装手动分区,标准分区(注意顺序): 自定义标准分区 /boot/efi 200M;/boot 1G 放引导程序和内核文件及根文件; /var 磁盘1/10内存尽量大存放日志文件; /usr 磁盘1/10内存尽量大存在程序软件包; swap 虚…...
vue的理解
什么是vue vue是一套用于构建用户界面的渐进式框架,与其他框架不同的是,vue被设计为可以自底向上逐层应用,它也是创建单页面应用的web应用框架。vue的核心库只关注视图层,不仅易上手,还便于与第三方库或既有项目整合。…...
111. UE5 GAS RPG 实现角色技能和场景状态保存到存档
实现角色的技能存档保存和加载 首先,我们在LoadScreenSaveGame.h文件里,增加一个结构体,用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…...
抖音短视频矩阵源代码部署搭建流程
抖音短视频矩阵源代码部署搭建流程 1. 硬件准备 需确保具备一台性能足够的服务器或云主机。这些硬件设施应当拥有充足的计算和存储能力,以便支持抖音短视频矩阵系统的稳定运行。 2. 操作系统安装 在选定的服务器或云主机上安装适合的操作系统是关键步骤之一。推…...
leetcode - LRU缓存
什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…...
计算机网络八股整理(一)
计算机网络八股文整理 一:网络模型 1:网络osi模型和tcp/ip模型分别介绍一下 osi模型是国际标准的网络模型,它由七层组成,从上到下分别是:应用层,表示层,会话层,传输层,…...
了解 CSS position 属性
CSS position 属性 在前端开发中,布局是一个至关重要的部分,而 CSS 的 position 属性是控制元素在页面中位置的核心工具。 本文将解释 CSS 中的 position 属性,包括其不同的值、效果及典型使用场景,以帮助你更好地理解和应用这一…...
数据结构 【二叉树(上)】
谈到二叉树,先来谈谈树的概念。 1、树的概念及结构 树是一种非线性的数据结构,它的逻辑关系看起来像是一棵倒着的树,也就是说它是根在上,而叶子在下的, 在树这种数据结构中,最顶端的结点称为根结点。在树的…...
C++11(中)
C11(中) 1.可变参数模板1.1.使用场景 2.lambda表达式(重要)2.1.使用说明2.2.函数对象与lambda表达式 3.线程库3.1.thread3.2.atomic原子库操作3.3.mutex3.3.1.mutex的种类3.3.2.lock_guard3.3.3.unique_lock 🌟&#x…...
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3
下拉选择器,选择框,支持单选、多选、筛选和清空功能,支持vue2和vue3https://ext.dcloud.net.cn/plugin?id8159 点击即可。 注意数据来源: 选择的:valueName:选择下拉选择显示的显示屏...
HTTP中GET和POST的区别是什么?
HTTP定义: GET:用于获取资源,通常用于请求数据而不改变服务器的状态 POST:用于提交数据到服务器,通常会改变服务器的状态或产生副作用(如创建或更新资源) 参数传递方式: GET&…...
day04 企业级Linux安装及远程连接知识实践
1. 使用传统的网卡命名方式 在启动虚拟机时,按tab键进入编辑模式 添加命令: net.ifnames0 biosdevname0 这样linux系统会使用传统的网卡命名,例如eth0、eth1…… 2. 快照 做系统关键操作时,一定要使用快照(先将系统关机) 3.…...
jvm核心组件介绍
1. 类加载器(ClassLoader): • 想象它是一个快递员,负责把Java类(.class文件)这个“包裹”从磁盘这个“发货地”送到JVM内部这个“目的地”。类加载器确保每个类只被加载一次,并维护一个类的层级…...
宏和电子冲刺港股:年营收11.7亿,利润2亿 股价一年上涨超10倍 市值1213亿
雷递网 雷建平 5月17日宏和电子材料科技股份有限公司(简称:“宏和电子”)日前递交招股书,准备在港交所上市。宏和电子2019年7月已在上交所上市。宏和科技在2025年5月时股价才9元,但一年时间股价上涨超过10倍࿰…...
Gemini3.1Pro数据投毒检测实战指南
检测 Gemini 3.1 Pro 输出是否受到数据投毒影响:从证据采集、门控验证到回归评测的产品化方案(含4周MVP路线图)数据投毒(Data Poisoning)会让模型在“看似正常”的输出中植入特定触发器:当输入触发某种模式…...
Windows用户的救星:APK Installer让你在电脑上轻松运行Android应用
Windows用户的救星:APK Installer让你在电脑上轻松运行Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上体验Androi…...
基于MCP协议构建AI工具服务器:连接Web与AI的标准化适配器
1. 项目概述:一个连接Web与AI的“万能适配器”如果你正在尝试让AI助手(比如ChatGPT、Claude)去访问一个网站、查询实时天气、或者控制你的智能家居,你可能会发现一个核心难题:这些大模型本身是“离线”的,它…...
Hyper-V DDA图形工具:告别PowerShell命令行的设备直通新时代
Hyper-V DDA图形工具:告别PowerShell命令行的设备直通新时代 【免费下载链接】DDA 实现Hyper-V离散设备分配功能的图形界面工具。A GUI Tool For Hyper-Vs Discrete Device Assignment(DDA). 项目地址: https://gitcode.com/gh_mirrors/dd/DDA 还在为Hyper-…...
别再为无人机航拍小目标漏检发愁了!用SAHI+YOLOv5n搞定高清图像识别(附完整代码)
无人机航拍小目标检测实战:SAHIYOLOv5n的高效解决方案 在广袤的农田上空,一架无人机正在执行例行巡检任务。高清摄像头捕捉到的画面中,几个微小的黑点引起了操作员的注意——那是几株感染病虫害的作物,它们在整幅图像中只占据不到…...
FastbootEnhance:面向Windows用户的终极Fastboot工具箱与Payload提取器指南
FastbootEnhance:面向Windows用户的终极Fastboot工具箱与Payload提取器指南 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance FastbootE…...
避坑指南:Unity热重载插件内存占用高?可能是Windows Defender在搞鬼
Unity热重载性能优化:解决Windows Defender导致的资源占用问题 当你在Unity开发过程中频繁修改C#代码时,热重载(Hot Reload)功能无疑是提升效率的利器。它能让你在游戏运行状态下即时看到代码修改效果,避免反复重启带来的时间浪费。然而&…...
如何用Sunshine打造个人游戏云:终极自托管游戏串流解决方案
如何用Sunshine打造个人游戏云:终极自托管游戏串流解决方案 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经梦想在任何设备上畅玩PC游戏?无论是想…...
移动端AI助手开发实战:混合架构、模型部署与性能优化
1. 项目概述:一个移动端AI助手的诞生 最近在移动端AI应用开发圈子里,一个名为 copaw-mobile 的项目开始引起不少同行的注意。这个由 xmingai 团队开源的项目,定位非常清晰——它要做的,就是将一个功能强大的AI助手,…...
