前言
有時候明明混淆規則配置好了(Retrofit+Rxjava+Gson+Okhttp組合),還是出現數據反序列化失敗問題,本次介紹一種特殊情況,就是主app目錄和module目錄下各有一個bean,app的bean關聯module的bean,即在子模塊裏儘量只放和子模塊相關的混淆規則,一些公有的混淆方式請放在app或者公有的模塊中。
問題復現
- app目錄
混淆規則:
- modlue目錄
混淆規則:
- 復現
Observable<ResponseDto<UpdateInfoDto>> checkUpdate(@Query("appId") String appId, @Query("versionCode") int versionCode);
這樣調用得到的ResponseDto<UpdateInfoDto>
的UpdateInfoDto字段都是默認值,即反序列化失敗。
結果返回如下:
ResponseDto{resultCode=0, resultMsg='檢查更新成功', resultObject=UpdateInfoDto{hasUpdate=false, versionCode=0, versionName='null', updateContent='null', url='null', md5='null', size=0, silent=false, force=false, autoInstall=false, ignorable=false}}
解決方法
百度一番說泛型類ResponseDto
沒有實現implements Serializable
,其實與這沒關係, 混淆配置Serializable只是爲了保證實現了Serializable
的類的字段不被混淆,當反序列化時能夠還原原來的對象。我懷疑是模塊間混淆優先級問題,解決辦法如下:
上面在app目錄下配置module bean的混淆規則,即覆蓋module bean的混淆規則,這樣就能成功反序列化了,如果知道問題根本原因的朋友告知一下。