Arouter->withSerializable传值失败源码解析

写在开头

最近有点忙!!!顺应时代的要求,我们App在开发了两年多后终于要开始架构整改了,老项目模块化与组件化的拆分构成,如果你经历过你懂得。
至于模块化和组件化的好处和模块化和组件化如何开展我就不多说了,网上一大推优秀的博客够我们看了嘿嘿。
这篇主要写下我在项目中使用Arouter的withSerializable传递对象时总是失败问题的一些理解,一个小坑吧,喜欢看一下就看一下喽!!!

##问题剖析

大家看官网可以知道,ARouter在传递对象的时候需要实现SerializationService接口进行对象的序列化和反序列化,当我使用withObject传递对象的时候,使用@Autowired注解获取参数值的时候是正确的,但是如果使用withSerializable方法传递对象,使用@Autowired注解获取到的值始终为空,经过一番探索,又发现直接使用getIntent的方式就可以获取到值了,作为一名程序员,这简直不能忍了,这是为什么呢?

###SerializationService是干啥的?

首先我们应该先闹懂SerializationService是干啥的?官网给出的解析是用来进行对象的序列化和反序列化,那么它是在哪里用的呢?又用来干什么的?让我们看下withObject的源码:

    /**
     * Set object value, the value will be convert to string by 'Fastjson'
     *
     * @param key   a String, or null
     * @param value a Object, or null
     * @return current
     */
    public Postcard withObject(@Nullable String key, @Nullable Object value) {
        serializationService = ARouter.getInstance().navigation(SerializationService.class);
        mBundle.putString(key, serializationService.object2Json(value));
        return this;
    }

Arouter会拿到你自己写的SerializationService类来进行序列化,我们可以看到Arouter底层对于对象的处理也是序列化为json进行传递。有序列化是必须有反序列化的,那么我们怎么看到反序列化过程的代码呢?那么就要依赖build下android系统对我们代码反编译的代码了。在build/generated/source/apt/debug/下:
这里写图片描述
涉及到部分公司参数,就打码了,嘿嘿。我们可以看到,在我们inject方法中,@Autowired注解会帮我们去拿我们传递的参数,在这里也是通过SerializationService来获取序列化的参数值的。
解释了SerializationService,我们也就明白withObject传值是没有障碍的。可以传值成功。

###withSerializable传值失败?

先看一下withSerializable的源码:

 /**
     * Inserts a Serializable value into the mapping of this Bundle, replacing
     * any existing value for the given key.  Either key or value may be null.
     *
     * @param key   a String, or null
     * @param value a Serializable object, or null
     * @return current
     */
    public Postcard withSerializable(@Nullable String key, @Nullable Serializable value) {
        mBundle.putSerializable(key, value);
        return this;
    }

你没有看错,它是直接存储进了bundle中,并没有进行任何操作,但是如果我们用@Autowired取值,它是肯定拿不到的啊,这也就解析了为啥直接使用getIntent的方式可以拿到值的道理了。

###PS一个小问题
我们项目中使用的事fastJson,如果你有参数的构造函数,一定要默认实现无参构造函数,否则会有意想不到的错误哦。
因为fastJson在parseObject方法中用到了反射。我们都知道,反射如果获取我们的对象是要这么获取的:
Class class = Class.forName(className);
Object object = class.newInstance(); // 只能调用无参构造函数
因此,我们需要一个无参的构造器来生成对象。

#写在最后
文章不长,只写到使用Aroter中遇到的一个小问题。如果您也在做组件化和模块化你的项目,可以一直讨论学习。QQ:807315559,欢迎您的叨扰。哈哈!!!!

### 解决 ARouter 编译器依赖找不到的问题 对于 Maven 项目中 `com.alibaba:arouter-compiler` 版本为 1.2.2 的依赖无法找到问题,可以考虑以下几个方面: 在构建文件中指定仓库地址能够有效解决问题。确保项目的根目录下的 `build.gradle` 文件已经包含了阿里云的 Maven 仓库配置[^1]。 ```gradle allprojects { repositories { google() jcenter() // 或者 mavenCentral(), 视具体环境而定 maven { url 'https://maven.aliyun.com/repository/public' } } } ``` 更新到最新的稳定版也可能解决兼容性和获取不到资源的问题。根据最新文档说明,ARouter API 和编译器插件都应升级至更高版本,比如 1.5.2,在 module 层级的 build.gradle 中做相应修改[^3]。 ```gradle dependencies { implementation('com.alibaba:arouter-api:1.5.2') kapt 'com.alibaba:arouter-compiler:1.5.2' } ``` 注意这里使用了 Kotlin Annotation Processing Tool (kapt),如果项目采用的是 Java,则继续沿用 annotationProcessor 关键字即可。 另外得注意的是,JCenter 已经停止服务,建议迁移到其他活跃的服务提供商如 Maven Central 或 Aliyun Maven Repository 来保证依赖项能被正常解析和下载[^2]。 #### 验证本地缓存网络连接状况 有时即使配置无误也会遇到因本地 Gradle 缓存或者临时性的网络波动造成的问题。尝试清理 Gradle Cache 并同步项目来排除这类因素的影响。 ```bash ./gradlew cleanBuildCache ``` 随后再次执行 Sync Project with Gradle Files 动作使更改生效并重新拉取所需依赖包。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值