最近老板說要把我們的艾派派(APP)重新計劃一下,我坐在樹杈上想了半天瘦穆,覺得好像阿里爸爸開源的的ARouter才可以滿足我的需求,于是我就去GayHub赊豌,啊呸 扛或、GitHub上擼了一下官方文檔、
正常使用是沒有問題的碘饼,但是在使用到SerializationService的時候熙兔,我發(fā)現(xiàn)我的對象竟然不能發(fā)過去,我的天哪艾恼!我可是對著官方文檔來的誒住涉!
- ARouter 版本 -> 沒錯
- kotlin支持kadp -> 沒錯
- FastJson版本 -> 沒錯
- 注解 -> 沒錯
一個一個對下去,完全都沒問題钠绍,沒轍舆声,只好去官方群里問一下,有群友說柳爽,你的空構造函數(shù)呢媳握?
我的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);
}
}
最后一行就是空構造函數(shù)磷脯。
然后我試著這樣寫試試:
class MyObj
{
var name: String? = null
var sex: String? = null
}
我發(fā)現(xiàn)蛾找,這樣子竟然成功了,不可思議……
我開始懷疑是不是FastJson的問題争拐,于是我去翻了FastJson的issues點這里
還真發(fā)現(xiàn)有人也遇見和我同樣的問題腋粥,說什么降低版本可以解決問題。降低版本我是拒絕的架曹、
剛開始我想著換用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
}
}
- 優(yōu)點万牺、使用Cache罗珍,直接使用原有對象洽腺,省去序列化與反序列化的消耗,以及帶來的各種沒必要的問題覆旱。使用UUID作為唯一Key蘸朋,不怕數(shù)據(jù)紊亂取錯數(shù)據(jù)。LruCache還會自我清理扣唱,所以也不怕數(shù)據(jù)太多就清除了藕坯。美滋滋~
End。