HarmonyOS putString与getString最终获取的value值不一致问题 ?

HarmonyOS putString与getString最终获取的value值不一致问题
1.putString和getString最终获取的value不一致问题:结尾会拼接上"true" “\B” 之类的莫名奇妙的多余字符。
2.该问题在调试中(模拟器和真机)是偶现的,分步骤拆解:1)创建对象 2)对象转成JSON串 3)写入 4)读取 5)再解析成对象,以上步骤执行最高1万次的压测,结果是随机的:正常的时候1万次都正常,但是不正常的时候第一次就不行。
3.putString的实现原理:在TS层把 string类型转成ArrayBuffer(通过TextEncoder去转)传递到C++ 层,然后C++层做真正的写入。读取时候类似。
4.怀疑点:通过Encoder或者Buffer去转格式时,华为底层可能存在兼容性问题,但又是随机的。
5.瓶颈:根据目前现象来看不像是代码逻辑的问题,比较难通过直接改代码的方式解决。

阅读 570
avatarAI BotBETA

针对您描述的HarmonyOS中putStringgetString最终获取的value值不一致问题,这里有几个可能的原因和解决方案建议:

可能原因

  1. 编码问题

    • 在使用TextEncoder转换字符串到ArrayBuffer时,可能存在字符编码不匹配的问题。特别是在处理特殊字符时,不同的编码方式可能导致不同的结果。
    • 如果在C++层处理这些ArrayBuffer时没有正确处理编码,也可能导致数据解析错误。
  2. 内存管理问题

    • 在C++层和TS层之间的数据传递过程中,可能存在内存管理不当导致的数据损坏。
    • 特别是如果数据在传递过程中被意外修改或释放,可能会导致读取到的数据与写入时的不一致。
  3. 并发访问问题

    • 如果在多线程环境下操作同一个存储区域,而没有适当的同步机制,可能会导致数据竞争和不一致。
  4. 框架或底层bug

    • 如您所述,可能是HarmonyOS框架或底层库中的bug导致的随机性问题。

解决方案

  1. 检查并统一编码

    • 确保在TextEncoder转换字符串时使用的编码(如UTF-8)与C++层处理时预期的编码一致。
    • 可以在C++层添加日志或断点,检查接收到的数据是否与预期一致。
  2. 加强内存管理

    • 确保在数据传递过程中,数据的生命周期得到妥善管理,避免数据被提前释放或修改。
    • 如果使用智能指针或类似机制,请确保它们的使用是正确的。
  3. 引入同步机制

    • 如果在多线程环境下操作存储区域,请确保使用适当的同步机制(如锁)来避免数据竞争。
  4. 联系华为开发者支持

    • 如果怀疑是框架或底层bug导致的问题,建议联系华为开发者支持团队,提供详细的复现步骤和日志信息,以便他们调查并修复问题。
  5. 增加错误处理和日志记录

    • 在整个数据处理流程中增加详细的错误处理和日志记录,以便在问题发生时能够快速定位和复现问题。
  6. 单元测试与压力测试

    • 编写单元测试来验证单个函数的正确性,并进行压力测试以确保在高负载下系统的稳定性。

通过这些步骤,您应该能够更接近问题的根源,并找到解决问题的有效方法。

1 个回答
  1. napi_get_arraybuffer_info 中用来接收 buffer结果的是 void** data类型,TS层传递下来的是string类型转成的ArrayBuffer。
  2. 在C++层接受数据时用的是 char *c_val 类型,关键点:C语言中字符串以‘\0‘结尾。
  3. 但是用 void** data 类型接受到的数据并不是 以 ‘\0‘结尾,所以在 c_val 转std::string 类型的时候 会在内存地址顺延去找 下一个‘\0‘,真正end 到下一个 ‘\0‘ 的数据就是日志中展示的乱码。
  4. 修复方案:在char *c_val 类型 转成 std::string时候 把c_val和 对应的数组长度 valBufferLen都传递到 std::string的构造参数中即可。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题