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了,搞得什么飞机,序列化它干嘛,直接用变量缓存不就完了么!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网贷教父判无期,千家万户哭成狗

作者|翻篇 新熔财经快评: 真是太气人了 e租宝崩盘后 比它更大的雷又来了 “网贷教父”周世平 非法吸收公众存款1090亿 被判了无期 48万多人的血汗钱啊 就这样血本无归了 要知道 当年周世平做p2p 就靠着全额垫付 这颗定心丸 大量的宝妈 上…

[陇剑杯 2021]日志分析

[陇剑杯 2021]日志分析 题目做法及思路解析(个人分享) 问一:单位某应用程序被攻击,请分析日志,进行作答: 网络存在源码泄漏,源码文件名是_____________。(请提交带有文件后缀的文件名&…

日志门面slf4j和各日志框架

简介 简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架, 其主要意义在于提供接口,具体的实现可以交由其他日志框架,如log4j、logback、log4j2。 对于一般的Java项目而言&#xff…

JavaEE之多线程编程:1. 基础篇

文章目录 一、关于操作系统一、认识进程 process二、认识线程三、进程和线程的区别(重点!)四、Java的线程和操作系统线程的关系五、第一个多线程编程 一、关于操作系统 【操作系统】 驱动程序: 如:我们知道JDBC的驱动程…

点评项目——分布式锁

2023.12.10 集群模式下的并发安全问题及解决 随着现在分布式系统越来越普及,一个应用往往会部署在多台机器上(多节点),通过加锁可以解决在单机情况下的一人一单安全问题,但是在集群模式下就不行了。见下图&#xff1a…

算法Day27 身材管理(三维背包)

身材管理(三维背包) Description Input Output Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 输入n的值int money sca…

1、混合方式UI设计

1、混合方式UI设计 新建项目添加静态资源添加资源添加action添加菜单菜单栏工具栏中间编辑区域 代码添加其他组件字体和大小状态栏 添加槽函数UI设置的转到槽的手写的设置应用程序图标 代码 新建项目 MainWindow代码文件夹主窗口为 (QMainWindow) 添加静态资源 AppIcon.icoi…

冬日寄快递省钱指南!出门差点冷冷冷冷冷冷傻了……

最近这段时间的天气 可以说令人备受煎熬 真的很喜欢冬天 有种藏在冰窖里的感觉 我理想中的冬天: 火炉、山药、糖炒栗子 实际上的夏天: 上班、挤地铁、爆冷 有一说一 这天气再冷就不合适了吧 现在连出门拿快递 都让人开心不起来了 冬日寒风凛冽…

数据结构与算法-D8D9队列实现及应用

队列:限制在两端进行插入和删除的线性表 允许进行存入操作的一端为“队尾” 允许进行删除操作的一端为“队头” 顺序队列 注意:front指向队头元素的位置 rear指向队尾元素的下一个位置 实现循环队列:(rear1)%N取余,为了区分空…

迅为IMX6UL核心板在便携式医疗设备中的应用方案

在科技日益发展的今天,便携式医疗设备变得越来越受欢迎。这些小巧、轻便的设备,例如IMX6UL核心板,为医疗行业带来了巨大的变革。它们不仅便于携带,而且集成了多种功能,满足了人们对健康管理的各种需求。 便携式医疗设备…

Linux系统---基于Pipe实现一个简单Client-Server system

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 Server是一个服务器进程,只能进行整数平方运算。Client要计算一个整数的平方的平方的平方,即…

如何在Linux本地部署openGauss开源数据管理系统并结合内网穿透公网访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合…

计算机毕业设计 基于Web的网上购物系统(pc端仿淘宝系统)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

3.vue学习笔记(条件渲染+列表渲染+通过key管理状态)

文章目录 1.条件渲染1.1. v-if1.2. v-else-if1.3. v-show1.4. v-if与v-show区别 2.列表渲染2.1. 复杂数据2.2. v-for与对象 3.通过key管理状态 1.条件渲染 在vue中,提供了条件渲染,这类似于JavaScript中的条件语句v-ifv-elsev-else-ifv-show1.1. v-if …

python中tkinter实现GUI程序:三个实例

python中tkinter实现GUI程序 写在最前面Python中使用Tkinter实现GUI程序的基本元素Tkinter简介基本元素1. 根窗口(Root Window)2. 小部件(Widgets)3. 布局管理4. 事件处理 1.用 tkinter实现一个简单的 GUI程序,单击“click”按钮&…

leetcode-21-合并两个有序链表(C语言实现)

题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 [] 输出…

Linux网络——高级IO

目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO: 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…

Python 学习笔记之 networkx 使用

介绍 networkx networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用 networkx 中的 Graph Graph 的定义 Graph 是用点和线来刻画离散事物…

【JAVA基础】----第一天

【JAVA基础】----第一天 命名规则注释方式对HelloWorld代码进行解释常量,进制转换和机器码展现计算过程常量类型1.字符串常量2.整数常量 提供了四种表现形式2.1 二进制2.2 八进制2.3 十进制2.4 十六进制2.5 进制之间的转化2.5.1 其他进制转化为十进制2.5.2 十进制转…

【算法优选】 动态规划之路径问题——贰

文章目录 🎋前言🌲[下降最小路径和](https://leetcode.cn/problems/minimum-path-sum/)🚩题目描述🚩算法思路:🚩代码实现 🎍[最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&…