FastJson ???? ???
/ Fastjson Android設計
Fastjson Android設計
Fastjson Android采用ASMDeserializerFactory設計
ASMDeserializerFactory是用來動態(tài)使用ASM生成JavaBean的Deserializer,針對每個類的特點進行特別優(yōu)化,以獲得最快的性能。
1. 局限性
1.1 虛擬機兼容
目前ASMDeserializerFactory不能在android的dalvik虛擬機以及阿里云OS的lemur虛擬機上運行。
虛擬機 | 是否支持 |
Oracle Hotspot | 支持 |
dalvik | 不支持 |
lemur | 不支持 |
public class ASMUtils { public static boolean isAndroid(String vmName) { String lowerVMName = vmName.toLowerCase(); return lowerVMName.contains("dalvik") || lowerVMName.contains("lemur") // aliyun-vm name ; } }
1.2 超多字段類
目前ASMDeserializerFactory不支持超過200個字段JavaBean。做反序列化的時候,需要定義局部變量保存parse的結(jié)果,目前的asm框架不能定義超過256個變量,目前保守的做法是,如果字段數(shù)量超過200個,則不使用ASMDeserializerFactory。
DeserializeBeanInfo beanInfo = DeserializeBeanInfo.computeSetters(clazz, type); if (beanInfo.getFieldList().size() > 200) { asmEnable = false; }
2 實現(xiàn)
2.1 創(chuàng)建實例
如果類有缺省public的構(gòu)造函數(shù),直接使用new來創(chuàng)建實例;否則使用JavaBeanDeserializer.createInstance(DefaultJSONParser, Type)來創(chuàng)建實例。
2.2 定義字段是否已經(jīng)被parse的標識變量
每32個變量的flag保存在一個int類型的變量中,_setFlag和_isFlag分別用于設置和讀取其是否被parse。