当前位置: 首页 > ds >正文

AIDL当Parcelable序列化的数据类通信时报“Class not found when unmarshalling“找不到该类时的解决方案

1. 报错栈 :cusText这个类找不到

2 16:01:29.796  1044  5718 E Parcel  : Class not found when unmarshalling: com.cus.sdk.cusText
08-02 16:01:29.796  1044  5718 E Parcel  : java.lang.ClassNotFoundException:  com.cus.sdk.cusText
08-02 16:01:29.796  1044  5718 E Parcel  : 	at java.lang.Class.classForName(Native Method)
08-02 16:01:29.796  1044  5718 E Parcel  : 	at java.lang.Class.forName(Class.java:454)

2. 解决方案

Message m = getMessage();
Bundle data = m.getData();if (data != null) {// 关键:设置与xxx相同的类加载器// 确保使用类本身的类加载器,而不是当前上下文的data.setClassLoader(cusText.class.getClassLoader());
}    

3. 解决原理:

这是因为类加载器(ClassLoader)决定了Java虚拟机如何查找和加载类,在跨进程/组件通信场景中,类加载器的不匹配是导致ClassNotFoundException的常见原因。

为什么需要手动设置类加载器?

Android应用中存在多个类加载器,不同的类加载器负责加载不同来源的类(如系统类、应用自身类、动态加载的插件类等)。默认情况下:

  • Bundle在反序列化时会使用当前上下文的类加载器(通常是当前Activity/Service的类加载器)。
  • 如果cusText类是由另一个类加载器加载的(例如:该类来自独立的库模块跨进程传递的类、或动态加载的dex),当前上下文的类加载器可能“不认识”这个类,就会报cusText找不到。

为什么cusText.class.getClassLoader()能解决问题?

cusText.class.getClassLoader()获取的是实际加载cusText类的类加载器。通过data.setClassLoader(...)强制Bundle使用这个类加载器来反序列化:

  • 确保了“加载类的加载器”和“反序列化时的类加载器”是同一个,系统能正确找到类的定义。
  • 避免了“当前上下文类加载器”找不到该类的问题(比如跨进程场景中,接收方和发送方的类加载器不同)。

举个形象的例子:

假设:

  • cusText类是由“库加载器(jar包)”加载的(来自一个独立的Android Library)。
  • 当前Activity的类加载器是“应用加载器”,它只认识应用自身的类,不认识“库加载器”加载的类。

此时:

  • 不设置类加载器:Bundle用“应用加载器”找cusText,找不到→报错。
  • 设置cusText的类加载器:Bundle用“库加载器”找,顺利找到→反序列化成功。

这就是为什么手动指定类加载器后,ClassNotFoundException会被解决——本质是让系统用“正确的钥匙(类加载器)”打开“正确的门(找到类)”。

http://www.xdnf.cn/news/17025.html

相关文章:

  • JVM 01 运行区域
  • Python Pandas.from_dummies函数解析与实战教程
  • ubuntu双系统设置默认启动系统
  • Windows本地使用dify搭建知识库+ollama+deepseek
  • Java单元测试和设计模式
  • winscp 连openwrt 返回127错误码
  • InfluxDB 与 Node.js 框架:Express 集成方案(一)
  • 【网络原理】HTTP协议(一)
  • Chisel芯片开发入门系列 -- 17. CPU芯片开发和解释7(5级流水线指令原理)
  • 【Flutter3.8x】flutter从入门到实战基础教程(八):公共state的集中管理机制
  • WordPress AI写作插件开发实战:从GPT集成到企业级部署
  • 【Java】不允许直接操作数据表中的数据,开发前台界面来实现对多个数据表的增删改查
  • 【LeetCode刷题指南】--二叉树的前序遍历,二叉树的中序遍历
  • 力扣-105.从前序与中序遍历序列构造二叉树
  • Makefile 从入门到精通:自动化构建的艺术
  • 【人工智能agent】--服务器部署PaddleX 的 印章文本识别模型
  • 详解Python标准库之互联网数据处理
  • 电脑手机热点方式通信(下)
  • 基于OAuth2与JWT的微服务API安全实战经验分享
  • 【云计算】云主机的亲和性策略(四):云主机组
  • Go语言中的闭包详解
  • 【读代码】 KAG项目:开源知识图谱自动构建与推理平台原理与实践
  • Spring框架深度学习实战
  • 深度学习核心:神经网络-激活函数 - 原理、实现及在医学影像领域的应用
  • 进阶向:自动化天气查询工具(API调用)
  • Munge 安全认证和授权服务的工作原理,以及与 Slurm 的配合
  • SpringCloud实战:机器人对战系统架构
  • 电脑手机热点方式通信(上)
  • 什么是AWS Region和AWS Availability Zones
  • 算法复杂度分析