Retrofit混淆后数据反序列化失败或数据解析失败问题

前言

有时候明明混淆规则配置好了(Retrofit+Rxjava+Gson+Okhttp组合),还是出现数据反序列化失败问题,本次介绍一种特殊情况,就是主app目录和module目录下各有一个bean,app的bean关联module的bean,即在子模块里尽量只放和子模块相关的混淆规则,一些公有的混淆方式请放在app或者公有的模块中。

问题复现

  1. app目录
    Retrofit混淆后数据反序列化失败或数据解析失败问题_第1张图片
    混淆规则:
    bean混淆
  2. modlue目录
    Retrofit混淆后数据反序列化失败或数据解析失败问题_第2张图片
    混淆规则:
    在这里插入图片描述
  3. 复现
    Observable<ResponseDto<UpdateInfoDto>> checkUpdate(@Query("appId") String appId, @Query("versionCode") int versionCode);

这样调用得到的ResponseDto的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的类的字段不被混淆,当反序列化时能够还原原来的对象。我怀疑是模块间混淆优先级问题,解决办法如下:
Retrofit混淆后数据反序列化失败或数据解析失败问题_第3张图片
上面在app目录下配置module bean的混淆规则,即覆盖module bean的混淆规则,这样就能成功反序列化了,如果知道问题根本原因的朋友告知一下。

你可能感兴趣的:(Android基础知识)