Alibaba开源的ARouter使用Serialization

作者: xiaolei123 | 来源:发表于2018-01-12 15:35 被阅读348次

    最近老板说要把我们的艾派派(APP)重新计划一下,我坐在树杈上想了半天,觉得好像阿里爸爸开源的的ARouter才可以满足我的需求,于是我就去GayHub,啊呸 、GitHub上撸了一下官方文档、

    正常使用是没有问题的,但是在使用到SerializationService的时候,我发现我的对象竟然不能发过去,我的天哪!我可是对着官方文档来的诶!

    • ARouter 版本 -> 没错
    • kotlin支持kadp -> 没错
    • FastJson版本 -> 没错
    • 注解 -> 没错

    一个一个对下去,完全都没问题,没辙,只好去官方群里问一下,有群友说,你的空构造函数呢?
    我的Bean代码(Kotlin)是这样的:

    class MyObj(var name: String? = null
                , var sex: String? = null)
    

    然后我再用反编译,查看Java源码:

    
    import kotlin.Metadata;
    import kotlin.jvm.internal.DefaultConstructorMarker;
    import org.jetbrains.annotations.Nullable;
    
    @Metadata(
       mv = {1, 1, 9},
       bv = {1, 0, 2},
       k = 1,
       d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\b\t\u0018\u00002\u00020\u0001B\u001d\u0012\n\b\u0002\u0010\u0002\u001a\u0004\u0018\u00010\u0003\u0012\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u0003¢\u0006\u0002\u0010\u0005R\u001c\u0010\u0002\u001a\u0004\u0018\u00010\u0003X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0006\u0010\u0007\"\u0004\b\b\u0010\tR\u001c\u0010\u0004\u001a\u0004\u0018\u00010\u0003X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\n\u0010\u0007\"\u0004\b\u000b\u0010\t¨\u0006\f"},
       d2 = {"Lcom/xiaolei/test/testroute/Beans/MyObj;", "", "name", "", "sex", "(Ljava/lang/String;Ljava/lang/String;)V", "getName", "()Ljava/lang/String;", "setName", "(Ljava/lang/String;)V", "getSex", "setSex", "production sources for module app"}
    )
    public final class MyObj {
       @Nullable
       private String name;
       @Nullable
       private String sex;
    
       @Nullable
       public final String getName() {
          return this.name;
       }
    
       public final void setName(@Nullable String var1) {
          this.name = var1;
       }
    
       @Nullable
       public final String getSex() {
          return this.sex;
       }
    
       public final void setSex(@Nullable String var1) {
          this.sex = var1;
       }
    
       public MyObj(@Nullable String name, @Nullable String sex) {
          this.name = name;
          this.sex = sex;
       }
    
       // $FF: synthetic method
       public MyObj(String var1, String var2, int var3, DefaultConstructorMarker var4) {
          if((var3 & 1) != 0) {
             var1 = (String)null;
          }
    
          if((var3 & 2) != 0) {
             var2 = (String)null;
          }
    
          this(var1, var2);
       }
    
       public MyObj() {
          this((String)null, (String)null, 3, (DefaultConstructorMarker)null);
       }
    }
    
    

    最后一行就是空构造函数。

    然后我试着这样写试试:

    class MyObj
    {
        var name: String? = null
        var sex: String? = null
    }
    

    我发现,这样子竟然成功了,不可思议……

    我开始怀疑是不是FastJson的问题,于是我去翻了FastJsonissues点这里

    还真发现有人也遇见和我同样的问题,说什么降低版本可以解决问题。降低版本我是拒绝的、


    笑哭

    刚开始我想着换用GSON算了,后来一想,我用LruCache不是更好??
    于是,我就换成LruCache:

    import android.content.Context
    import android.util.LruCache
    import com.alibaba.android.arouter.facade.annotation.Route
    import com.alibaba.android.arouter.facade.service.SerializationService
    import java.lang.reflect.Type
    import java.util.*
    
    /**
     * Created by xiaolei on 2018/1/12.
     */
    @Route(path = "/service/cache")
    class CacheServiceImpl : SerializationService
    {
        private val cacheInstance by lazy {
            val maxMemory = Runtime.getRuntime().maxMemory()
            val cacheSize = (maxMemory / 8).toInt()
            LruCache<String, Any>(cacheSize)
        }
    
        override fun init(context: Context)
        {
    
        }
    
        override fun object2Json(instance: Any): String
        {
            val uuid = UUID.randomUUID().toString()
            cacheInstance.put(uuid, instance)
            return uuid
        }
    
        override fun <T : Any> json2Object(input: String, clazz: Class<T>): T = parseObject(input, clazz)
    
        override fun <T : Any> parseObject(uuid: String, clazz: Type): T
        {
            val obj = cacheInstance.get(uuid)
            cacheInstance.remove(uuid)
            return obj as T
        }
    }
    
    • 优点、使用Cache,直接使用原有对象,省去序列化与反序列化的消耗,以及带来的各种没必要的问题。使用UUID作为唯一Key,不怕数据紊乱取错数据。LruCache还会自我清理,所以也不怕数据太多就清除了。美滋滋~

    End。

    相关文章

      网友评论

      • zxzx74147:Good idea.
        但是有一点:
        val maxMemory = Runtime.getRuntime().maxMemory()
        val cacheSize = (maxMemory / 8).toInt()
        LruCache<String, Any>(cacheSize)

        cacheSize的选择是不是不太合适,默认LruCache是一条记录计数size+1,这么算cacheSize有点大了。
        虽然后面都有remove操作,影响不大。

      本文标题:Alibaba开源的ARouter使用Serialization

      本文链接:https://www.haomeiwen.com/subject/atefoxtx.html