Fastjson Android 版本

Fastjson提供Android版本,和标准版本相比,Android版本去掉一些Android虚拟机dalvik不支持的功能,使得jar更小,同时针对dalvik做了很多性能优化,包括减少方法调用等。parse为JSONObject/JSONArray时比原生org.json速度快,序列化反序列化JavaBean性能比jackson/gson性能更好。

Android 版本的 Fastjson 下载

  • 通过 Maven 下载:
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>VERSION_CODE</version>
    </dependency>
    
  • 或者 Gradle 下载:
    compile 'com.alibaba:fastjson:VERSION_CODE'
    
  • 用真实发行版本号替换 VERSION_CODE , 例如 1.1.54.android

Android 版本中去掉的功能

  1. ASM:Dalvik虚拟机的字节码格式和Java SE不一样,目前的ASM动态优化无法在Android上实现。
  2. AWT:Android上的Dalvik虚拟机不支持awt,所以去掉标准版本的awt相关类序列化和反序列化的支持。
  3. AtomicXXX:AtomicXXX不应该作为POJO的属性,不常用,所以在Android版本中去掉了。
  4. 不支持Clob对象序列化。
  5. JSONPObject:这个功能用于Web JSONP数据生成,不常用于Android客户端,所以去掉。
  6. 不支持Reference字段类型序列化和反序列化,比如WeakReference/SoftReference/AtomicReference,这些类型不常用用作POJO的属性,所以去掉了。
  7. 以下方法不常用,不支持
    public abstract class JSON {
        public static parseObject(byte[] input, int off, int len, CharsetDecoder charsetDecoder, Type clazz,
                                          Feature... features) { ... }
        public static Object parse(byte[] input, int off, int len, CharsetDecoder charsetDecoder, 
                                          int features) {}
        public static Object parse(byte[] input, int off, int len, CharsetDecoder charsetDecoder, 
                                          Feature...features) {}
        public static Object parse(byte[] input, int off, int len, CharsetDecoder charsetDecoder, 
                                          int features) {}
    }
    // JSONSerializerMap已废弃,不支持
    com.alibaba.fastjson.serializer.JSONSerializer.JSONSerializer(JSONSerializerMap)
    
  8. 一些废弃的类不支持
    com.alibaba.fastjson.parser.JavaBeanMapping 使用com.alibaba.fastjson.parser.ParserConfig代替com.alibaba.fastjson.serializer.JSONSerializerMap  使用com.alibaba.fastjson.serializer.SerializeConfig代替com.alibaba.fastjson.parser.DefaultExtJSONParser 使用com.alibaba.fastjson.parser.DefaultJSONParser代替
    
  9. 一些废弃方法不支持
    class com.alibaba.fastjson.JSONWriter {
        @Deprecated
        public void writeStartObject();
        @Deprecated
        public void writeEndObject();
        @Deprecated
        public void writeStartArray();
        @Deprecated
        public void writeEndArray();
    }
    

Fastjson Android设计

ASMDeserializerFactory 是用来动态使用 ASM 生成 JavaBean 的 Deserializer,针对每个类的特点进行特别优化,以获得最快的性能。

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的结果,目前的asm框架不能定义超过256个变量,目前保守的做法是,如果字段数量超过200个,则不使用ASMDeserializerFactory。

DeserializeBeanInfo beanInfo = DeserializeBeanInfo.computeSetters(clazz, type);
if (beanInfo.getFieldList().size() > 200) {
    asmEnable = false;
}

2 实现

2.1 创建实例

如果类有缺省public的构造函数,直接使用new来创建实例;否则使用JavaBeanDeserializer.createInstance(DefaultJSONParser, Type)来创建实例。

2.2 定义字段是否已经被parse的标识变量

每32个变量的flag保存在一个int类型的变量中,_setFlag和_isFlag分别用于设置和读取其是否被parse。

下一节:本文介绍 Fastjson 序列化与反序列化的几种实现方式。