前言
有时候明明混淆规则配置好了(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的混淆规则,这样就能成功反序列化了,如果知道问题根本原因的朋友告知一下。