Alibaba开源的ARouter使用SerializationService新姿势

最近老板说要把我们的艾派派(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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据学习笔记

Flink学习笔记:1、Flink快速入门

官方文档:https://ci.apache.org/projects/flink/flink-docs-release-1.3/quickstart/setu...

1.1K10
来自专栏HansBug's Lab

1230: [Usaco2008 Nov]lites 开关灯

1230: [Usaco2008 Nov]lites 开关灯 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: ...

2768
来自专栏HansBug's Lab

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory L...

2565
来自专栏函数式编程语言及工具

Akka(41): Http:DBTable-rows streaming - 数据库表行交换

  在前面一篇讨论里我们介绍了通过http进行文件的交换。因为文件内容是以一堆bytes来表示的,而http消息的数据部分也是byte类型的,所以我们可以直接用...

2437
来自专栏小樱的经验随笔

江西理工大学南昌校区cool code竞赛

      这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1...

43011
来自专栏码农阿宇

NopCommerce开源项目中很基础但是很实用的C# Helper方法

3493
来自专栏大大的微笑

设计模式之策略模式

         策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。 UML: ? //工厂方法,用来生产策略 public cla...

2146
来自专栏算法修养

浙江工业大学校赛 小M和天平

小M和天平 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja...

2926
来自专栏Java帮帮-微信公众号-技术文章全总结

【学习经验】Java中常用英文

【学习经验】Java中常用英文 第一章: public['pʌblik] 公共的,公用的 static['stætik] 静的;静态的...

35410
来自专栏Java帮帮-微信公众号-技术文章全总结

秒懂,Java 注解 (Annotation)你可以这样学【面试+工作】

这处图片引自老罗的博客。为了避免不必要的麻烦,首先声明我个人比较尊敬老罗的。至于为什么放这张图,自然是为本篇博文服务,接下来我自会说明。好了,可以开始今天的博...

2403

扫码关注云+社区