最近老板说要把我们的艾派派(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的问题,于是我去翻了FastJson的issues点这里
还真发现有人也遇见和我同样的问题,说什么降低版本可以解决问题。降低版本我是拒绝的、
刚开始我想着换用GSON算了,后来一想,我用LruCache不是更好??
于是,我就换成LruCache:
import android.content.Contextimport android.util.LruCacheimport com.alibaba.android.arouter.facade.annotation.Routeimport com.alibaba.android.arouter.facade.service.SerializationServiceimport java.lang.reflect.Typeimport 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。
作者:xiaolei123
链接:https://www.jianshu.com/p/6d26469dee39