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

1,126 阅读3分钟
原文链接: blog.csdn.net

写在开头

最近有点忙!!!顺应时代的要求,我们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,欢迎您的叨扰。哈哈!!!!