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.pswp.cn/news/214888.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214888.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214888.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人大金倉證書過期問題

select count(*) from sys_stat_activity select GET_LICENSE_VALIDDAYS(); 試用企業版3個月到期后,改為專業版,有效期仍是3個月 1、在kingbase用戶下執行sys_ctl -D data start時報錯 ./sys_ctl -D /home/kingbase/KingbaseES/data start 等待服務器進…

P1160 隊列安排

這很明顯是一個鏈表的題目&#xff0c;考鏈表的基礎知識 開始先定義了一個結構體節點&#xff0c;里面有一個val和一個指向node結構體的指針next 然后通過typedf將linkedlist表示為一個指向node的指針 insert代表右插入 push是左插入 #include <iostream> using nam…

[足式機器人]Part2 Dr. CAN學習筆記-自動控制原理Ch1-3燃燒卡路里-系統分析實例

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-自動控制原理Ch1-3燃燒卡路里-系統分析實例 1. 數學模型2. 比例控制 Proprotional Control 1. 數學模型 2. 比例控制 Proprotional Control

建筑工程企業網站建設的效果如何

建筑工程團隊也是市場重要的組成部分&#xff0c;尤其是建筑公司&#xff0c;往往更具品牌力&#xff0c;而在企業發展方面也面臨多個痛點&#xff1a; 1、品牌宣傳拓客難 建筑工程屬于高價、長時間跟進的行業&#xff0c;因此無論需求者還是商家都非常看重企業品牌及業務縱深…

C++學習筆記(十三)

一、C對象模型和this指針 1.1 成員變量和成員函數分開存儲 在C中&#xff0c;類內的成員變量和成員函數分開存儲 只有非靜態成員變量才屬于類的對象 #include <iostream>using namespace std;class a1 {};class a2 {int a; };class a3 {int a;static int b; };class …

基于ssm端游賬號銷售管理系統論文

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對端游賬號銷售信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全…

讓你從此不再懼怕ANR

原文鏈接 讓你從此不再懼怕ANR 這篇文章是基于官方的Diagnose and fix ANRs翻譯而來&#xff0c;但也不是嚴格的翻譯&#xff0c;原文的內容都在&#xff0c;又加上了自己的理解以及自己的經驗&#xff0c;以譯注的形式對原文的作一些補充。 當一個Android應用的UI線程被阻塞時…

[排序篇] 冒泡排序

目錄 一、概念 二、冒泡排序 2.1 冒泡降序(從大到小排序) 2.2 冒泡升序(從小到大排序) 三、冒泡排序應用 總結 一、概念 冒泡排序核心思想&#xff1a;每次比較兩個相鄰的元素&#xff0c;如果它們不符合排序規則&#xff08;升序或降序&#xff09;則把它們交換過來。…

Linux內存管理(十七):percpu 機制(2)——動態分配

源碼基于:Linux5.4 約定: 芯片架構:ARM64內存架構:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :3關聯博文: percpu機制(1)——框架實現 percpu機制(2)——動態分配 0. 前言 上一篇博文 我們剖析了 percpu 機制的整個框架,包括per…

大致人類應該是短時記憶和利用短時記憶控制利用周圍環境達到長期記憶的吧

這里寫目錄標題 圖代碼代碼解析圖 代碼 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

小程序嵌套H5

小程序嵌套H5 使用Hbuild x開發H5頁面項目里面使用了js-sdk工具包H5發布完成之后生成URL。新建一個小程序空項目&#xff0c;填寫小程序的appid。本地調試的時候如果報錯無法打開該網頁&#xff0c;那么需要勾選先的不校驗。發布體驗版本需要注意下面的兩個配置點。 使用Hbuild…

中通快遞單號查詢入口,將指定某天簽收的單號篩選出來

批量查詢中通快遞單號的物流信息&#xff0c;將指定某天簽收的單號篩選出來。 所需工具&#xff1a; 一個【快遞批量查詢高手】軟件 中通快遞單號若干 操作步驟&#xff1a; 步驟1&#xff1a;運行【快遞批量查詢高手】軟件&#xff0c;并登錄 步驟2&#xff1a;點擊主界面左…

Spring Boot中JdbcTemplate多數據源配置

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

編譯 Flink代碼

構建環境 JDK1.8以上和Maven 3.3.x可以構建Flink&#xff0c;但是不能正確地遮蓋某些依賴項。Maven 3.2.5會正確創建庫。所以這里使用為了減少問題選擇 Maven3.2.5版本進行構建。要構建單元測試&#xff0c;請使用Java 8以上&#xff0c;以防止使用PowerMock運行器的單元測試失…

云計算核心技術

1.1 云計算的定義 云計算是目前業內的熱點概念&#xff0c;它以開放的標準和服務為基礎&#xff0c;以互聯網為中心&#xff0c;提供安全、快速、便捷的數據存儲和網絡計算服務&#xff0c;讓互聯網這片“云”上的各種計算機共同組成數個龐大的數據中心及計算中心。它可以被看成…

求職智能分析系統

本項目是一個基于Flask輕量級框架的計算機就業數據可視化分析平臺。 采用echarts和ajax等技術進行數據展示和用戶交互。

【電路筆記】-電位器

電位器 文章目錄 電位器1、概述2、電位器類型2.1 旋轉電位器2.2 滑塊電位器2.3 預設和微調電位器2.4 變阻器 3、電位器示例14、電位器作為分壓器5、電位器示例26、變阻器6、滑塊變阻器7、線性或對數電位器8、總結 當連接的軸物理旋轉時&#xff0c;電位計和變阻器的電阻值會發生…

一個簡單的Wireshark和TCP三次握手,為什么能難住阿里6年測試?

之前寫過一篇博客&#xff1a;用 Fiddler 來調試HTTP&#xff0c;HTTPS。 這篇文章介紹另一個好用的抓包工具wireshark&#xff0c; 用來獲取網絡數據封包&#xff0c;包括http,TCP,UDP&#xff0c;等網絡協議包。 記得大學的時候就學習過TCP的三次握手協議&#xff0c;那時候…

Vue中 v-show 和 v-if 有什么區別

Vue中的 v-show 和 v-if 一.v-show 與 v-if 原理分析v-show 原理v-if 原理 二、v-show 與 v-if 的共同點三、v-show 與 v-if 的區別四、v-show 與 v-if 的使用場景使用 v-show 的場景&#xff1a;使用 v-if 的場景&#xff1a; 五、v-show 與 v-if 的優缺點v-show優點&#xff…

kafka rebalance(再均衡)導致的消息積壓分析

起因&#xff1a; 某天&#xff0c;項目組收到大量的kafka消息積壓告警。查看了kafka日志后&#xff0c;發現 kafka不斷地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分區的所有權從一個消費者轉移到另一個消費者&#xff0c;這樣的行為被稱為Rebalance (再均衡)…