BluetoothDevice 序列化问题

文章目录

  • 前言
  • 思考
  • 分析
    • 定位


前言

在做蓝牙设备通信时,遇到一个奇葩的问题,公司另一个部门开发的蓝牙组件库,把蓝牙设备BluetoothDevice进行了序列化,在连接时候又进行反序列化。但是当我去调试我的项目时,发现发序列化后的对象是个“{}”。


起初,我还纳闷,到底是为什么?为什么?!!!
其他项目组引用时候都没事,怎么到我这里就出问题了?!
难道是我引用组件的姿势不对?


后来对比了下,我发现:把项目的targetSdk降到27就好了!

问题是解决了,但是,为什么呢?

本着不抛弃、不放弃的原则,我去翻看了源码,对比了sdk27和sdk28的BluetoothDevice的源码,结果发现:

除了多了两个方法,其他完全没什么大的区别啊!


这就奇怪了!为什么呢?!!
头皮上的痘痘都挠破了,也想不出来啊!!


思考

冷静下来,认真思考:

问题现象是:BluetoothDevice反序列化后得到的是{},而不是null。说明这个对象还是存在的,只是对象里的属性没有了。

分析

序列化和反序列化都是使用的gson,会不会是gson的bug呢?
于是,我对gson序列化BluetoothDevice的代码,打上断点,一步一步的去排查,最终,在ReflectiveTypeAdapterFactory 中找到了问题的根源。
在这里插入图片描述

原来gson内部也是通过反射获取对象的属性,然后进行一系列的操作,不啦不啦不啦…的

如果序列化后得到的是{},那这里是不是就会有问题。
于是,我通过debug,对比了sdk=27和sdk=28时,raw.getDeclaredFields()这里的区别:


当sdk=27时:
在这里插入图片描述
当sdk=28时:
在这里插入图片描述
震惊了!
sdk=28时,通过反射获取属性,竟然没有找到mAddress,且数组长度比sdk=27是少了好多!

定位

查找了安卓不同api的差异,我终于在安卓9.0中的“行为变更”中发现了端倪:
在这里插入图片描述
对于官方的这块解释,我的理解是:源码中的属性不再是你想通过反射就能自由获取的了!

其实,这个问题在好多功能使用时也遇到过,就是随便从百度搜索的结果中,就能发现之前的有些功能,动不动就是通过反射,调用源码内部的某些私有方法,以达到出奇制胜的效果。在早期的安卓版本中,确实能起到一定的作用,但是随着版本的不断提升,这些方法往往变得调用不通了。

最终,我也是定位到了问题的原因,既然是系统不允许再访问私有属性,那gson自然也拿不到maddress。自然得到的序列化对象没有对应的属性值。

所以,还是改自己的代码吧,别序列化BluetoothDevice了,搞得什么飞机,序列化它干嘛,直接用变量缓存不就完了么!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/266262.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】最小体力消耗路径

文章目录 Tag题目来源解题思路方法一:二分枚举答案 写在最后 Tag 【二分枚举答案】【图】【2023-12-11】 题目来源 1631. 最小体力消耗路径 解题思路 拿到这个题目,计算从左上角到右下角的最小体力消耗值,有点像 64. 最小路径和。在 64 题…

以太坊:前世今生与未来

一、引言 以太坊,这个在区块链领域大放异彩的名字,似乎已经成为了去中心化应用(DApps)的代名词。从初期的萌芽到如今的繁荣发展,以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生,以…

C# 任务的异常和延续处理

写在前面 当Task在执行过程中出现异常或被取消等例外的情况时,为了让执行流程能够继续进行,可以使用延续方法实现这种链式处理;还可以针对前置任务不同的执行结果,选择执行不同的延续分支方法。子任务执行过程中的任何异常都会被…

分页设计(平时在表下面的栏框,有首页 | 上一页 | 下一页 | 尾页),下面代码带你实现

分页设计的本质就是,分页查询,就是SQL语句当中的(select * from ? limit ? , ?),这里第一个?是所分页的那张表 ,第二个?从哪条开始,第三个?是在页面上想让这张表出现几…

老师们居然这样把考试成绩发给家长

教育是一个复杂而多元的过程,其中考试成绩的发布和沟通是教育过程中的一个重要环节。然而,有些老师在发布考试成绩时,采取了一些不恰当的方式,给家长和学生带来了不必要的困扰和压力。本文将探讨老师们不应该采取的发布考试成绩的…

MSPM0L1306例程学习-ADC部分(1)

MSPM0L1306例程学习-ADC部分(1) MSPM0L1306例程学习 使用的TI的官方例程,即SDK里边包含的例程代码。 MCU使用的是MSPM0L1306, 对于ADC部分,有10个例程: 例程理解 ADC的转换有多种工作模式,从最简单的单通道单次转换开始入手…

远程控制如何赋能智能制造?贝锐向日葵制造业场景案例解析

随着数字化转型在制造业的不断深入,企业在产线端也逐渐投入更多智能化设备,数字化、智能化设备其中一个比较显著的优势就是可以依托互联网实现远程运维和调试,大大提升产线设备的稳定性和工作效率;而远程调试运维一个重要的实现方…

Spring Cache【娓娓道来】

目录​​​​​​​ 1.自我介好😳😳😳 2.常用注解 💕💕💕 3.EnableCaching🤦‍♂️🤦‍♂️🤦‍♂️ 4.CachePut🤷‍♀️🤷‍♀️&#x1f93…

.9.png编译报错

android项目中使用9-patch图编译报错:AAPT: error: file failed to compile. 原因是因为.9.png图中有线之间断开或者黑点的存在,把线连上或者把黑点去掉就可以了。如下:

云降水物理基础

云降水物理基础 云的分类 相对湿度变化方程 由相对湿度的定义,两边取对数之后可以推出 联立克劳修斯-克拉佩龙方程(L和R都为常数) 由右式看出,增加相对湿度的方式:增加水汽(de增大)和降低…

Linux系统vim,gcc,g++工具使用及环境配置,动静态库的概念及使用

Linux系统vim,gcc,g工具使用及环境配置,动静态库的概念及使用 1. Linux编辑器-vim的使用1.1 vim的基本概念1.2vim的基本操作1.3vim正常模式命令集1.4vim末端模式命令集1.5简单的vim配置 2.Linux编译器-gcc/g的使用2.1 准备阶段2.2gcc的使用2.…

【人工智能 | 知识表示】问题规约法 谓词/符号逻辑,良好的知识表示是解题的关键!(笔记总结系列)

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…