ASM在FastJson中的应用

本文介绍了ASM在FastJson中的应用,用于提高序列化和反序列化的性能。在满足特定条件时,FastJson通过ASM生成子类,避免反射操作。内容包括ASM的启用条件、ASMSerializer的创建过程、反序列化方法,以及如何查看和加载ASM生成的类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上文ASM入门篇中除了对ASM的使用做了介绍,同时也提到ASM被使用的一些场景,其中有一项就是ASM被用来代替Java反射;FastJson作为序列化工具,就使用了ASM来代替反射的使用,提高整体的性能。

序列化

序列化就是将对象转换成Json格式的字符串,然后用来持久化或者网络传输;FastJson提供了接口类ObjectSerializer

public interface ObjectSerializer {
   
    
    void write(JSONSerializer serializer, //
               Object object, //
               Object fieldName, //
               Type fieldType, //
               int features) throws IOException;
}
  • serializer:序列化上下文;
  • object:需要转换为Json的对象;
  • fieldName:父对象字段名称;
  • fieldType:父对象字段类型;
  • features:父对象字段序列化features;

ObjectSerializer的实现类有多种,最常见就是序列化JavaBeanJavaBeanSerializer,当然还有一些其他类型的序列化工具类比如:基本类型、日期类型、枚举类型、一些特殊类型等等;引入的ASM正是对JavaBeanSerializer的优化,当然要使用ASM优化也是有条件的,满足条件的情况下会通过ASM生成JavaBeanSerializer的子类,代替里面的反射操作;

启用条件

FastJson提供了ASM的开关,默认开启状态,同时在满足一定的条件下才能使用ASMSerializerFactory创建ASMSerializer

开关

SerializeConfig中提供了asm开关标识:

private boolean asm = !ASMUtils.IS_ANDROID

默认安卓环境下为false,否则为true,所有服务端开发一般都是开启asm的;

JSONType注解
  • 如果配置了serializer,则使用配置的序列化类:
@JSONType(serializer = JavaBeanSerializer.class)
  • 如果配置了asmfalse,则不启用asm
@JSONType(asm = false)
  • 如果配置了指定几种SerializerFeature,则不开启asm
@JSONType(serialzeFeatures = {
   SerializerFeature.WriteNonStringValueAsString,SerializerFeature.WriteEnumUsingToString,SerializerFeature.NotWriteDefaultValue,SerializerFeature.BrowserCompatible})
  • 如果配置了SerializeFilter,则不开启asm
@JSONType(serialzeFilters = {
   })
BeanType类信息

如果类修饰符不为public,则不开启asm,直接使用JavaBeanSerializer

如果类名称字符中包含了<001 || >177 || ==.的字符,则不启用asm

如果类是接口类则不启用asm

对类属性的检查,包括类型,返回值,注解等,不符合的情况下同样不启用asm

创建ASMSerializer

通过ASM为每个JavaBean生成一个独立的JavaBeanSerializer子类,具体步骤如下:

生成类名

创建类之前需要生成一个唯一的名称:

String className = "ASMSerializer_" + seed.incrementAndGet() + "_" + clazz.getSimpleName()

这里的seed是一个AtomicLong变量;以Person为例,则生成的classNameASMSerializer_1_Person

生成子类

通过ASM的ClassWriter来生成JavaBeanSerializer的子类,重写write方法,JavaBeanSerializer中的write方法会使用反射从JavaBean中获取相关信息,而通过ASM生成的ASMSerializer_1_Person,是针对Person独有的序列化工具类,可以看部分代码:

public class ASMSerializer_1_Person
extends JavaBeanSerializer
implements ObjectSerializer {
   
    public ASMSerializer_1_Person(SerializeBeanInfo serializeBeanInfo) {
   
        super(serializeBeanInfo);
    }

    public void write(JSONSerializer jSONSerializer, Object object, Object object2, Type type, int n) throws IOException {
   
        if (object == null) {
   
            jSONSerializer.writeNull();
            return;
        }
        SerializeWriter serializeWriter = jSONSerializer.out;
        if (!this.writeDirect(jSONSerializer)) {
   
            this.writeNormal(jSONSerializer, object, object2, type, n);
            return;
        }
        if (serializeWriter.isEnabled(32768)) {
   
            this.writeDirectNonContext(jSONSerializer, object, object2, type, n);
            return;
        }
        Person person = (Person)object;
        if (this.writeReference(jSONSerializer, object, n)) {
   
            return;
        }
        if (serializeWriter.isEnabled(0x200000)) {
   
            this.writeAsArray(jSONSerializer, object, object2, type, n);
            return
### 回答1: Fastjson 2.0.4是一种开源的Java JSON解析库。它提供了一种高效快速的方式来将Java对象转换为JSON格式,并且可以将JSON格式的数据转换为Java对象。Fastjson具有以下特点和优点: 首先,Fastjson具有很高的解析和序列化速度。它通过优化内存结构和算法,在大数据量情况下能够更加高效地解析和序列化JSON数据。 其次,Fastjson支持很多强大的功能。它能够处理复杂的JSON数据结构,如嵌套对象、数组、集合等。同时,它还支持自定义序列化和反序列化逻辑,可以方便地对特定类型的数据进行处理。 此外,Fastjson还具有很好的兼容性。它能够适应不同的Java版本和开发环境,支持在Java 1.5及以上版本中使用。而且它还可以与其他流行的Java框架和库(如Spring、Hibernate等)进行无缝集成。 最后,Fastjson是一个活跃的开源项目,拥有强大的社区支持和持续的更新。它的代码质量和稳定性经过了长期的验证和改进,并且有很多的文档和示例可以供开发者参考。 总而言之,Fastjson 2.0.4是一个优秀的JSON解析库,它具有高效快速、强大功能和良好兼容性等优点。它可以帮助开发者更加方便地处理JSON数据,提高开发效率。 ### 回答2: fastjson 2.0.4是一个Java语言编写的开源JSON解析器和生成器。它是阿里巴巴集团开发的一款高性能的JSON库,目的是提供快速、灵活和易用的JSON解析解决方案。 fastjson 2.0.4具有以下特点和优势: 1. 高性能:fastjson 2.0.4采用了一系列优化措施,如反射缓存、预先生成ASM字节码等,以提升解析速度和性能。 2. 完善的功能:fastjson 2.0.4支持常见的JSON数据操作,包括JSON对象的解析、生成、转换等;同时还支持自定义序列化和反序列化规则。 3. 灵活易用:fastjson 2.0.4提供了简单易用的API接口,使用起来非常方便;同时还支持在复杂场景下进行定制化配置和使用,以满足开发者的不同需求。 4. 广泛应用fastjson 2.0.4已广泛应用于各种Java项目中,包括后端服务器、移动应用程序等等,得到了众多开发者的认可和使用。 然而,需要注意的是,fastjson 2.0.4版本存在一些安全漏洞,可能导致应用程序受到JSON注入攻击。因此,建议使用更高版本的fastjson,或者采取其他安全防护措施来保护应用程序的安全。 ### 回答3: fastjson 2.0.4是一种用于Java编程语言的开源JSON处理库。它提供了一种快速高效的方式来解析和生成JSON数据。该库具有很多优秀的特性和功能。 首先,fastjson 2.0.4具有优秀的性能。它通过高效的算法和优化的实现,可以对大型的JSON数据进行快速解析和生成。这可以大大提高程序的运行效率,并节省计算资源的使用。 其次,fastjson 2.0.4支持多种数据类型的序列化和反序列化。它可以处理复杂的对象和嵌套数据结构,并将它们转换为JSON格式。同时,它也可以将JSON数据还原为原始的Java对象,方便程序进行后续的处理和使用。 此外,fastjson 2.0.4还支持灵活的配置选项。开发人员可以根据自己的需求来调整库的行为和性能。例如,可以配置序列化和反序列化规则、数据格式、日期格式等。这种灵活性使得fastjson 2.0.4适用于各种不同的应用场景。 除了以上这些主要特性,fastjson 2.0.4还具有其他一些额外的功能。例如,它支持自定义序列化和反序列化过程,可以根据实际需求实现特定的转换逻辑。此外,它还提供了一些工具类和辅助方法,方便开发人员进行JSON数据的处理和操作。 总的来说,fastjson 2.0.4是一款功能丰富、性能优越的JSON处理库。它在Java开发中被广泛应用,为开发人员提供了方便快捷的JSON处理解决方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值