栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

FastJSON源码分析-SerializeConfig类的分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

FastJSON源码分析-SerializeConfig类的分析

2021SC@SDUSC

本篇简介
public static String toJSONString(Object object, SerializeConfig config, SerializerFeature... features) {
        return toJSONString(object, config, (SerializeFilter) null, features);
    }

我们在前面的文章分析toJSONString的过程中看到除了要转换为JSON字符串的对象外,还有两个参数:SerializeConfig对象和SerializerFeature对象,一般我们在调用toJSONString方法的时候都不会去传递这两个参数,可是最终我们调用的重载方法也会传入相关的参数,那么本篇文章主要来分析其中的SerializeConfig类;

分析


这个类的创建方法类似于单例模式,也就是全局只有一个它的对象,默认创建参数为tableSize为8192和fildbase为false的对象。
该类中维护着两个IdentityHashMap,该类是重写的HashMap

 private final IdentityHashMap serializers;
    private final IdentityHashMap> mixInSerializers;

其中serializers的初始化大小为8192,mixInSerializers的初始化大小为16,在初始化方法中:

private void initSerializers() {
        put(Boolean.class, BooleanCodec.instance);
        put(Character.class, CharacterCodec.instance);
        put(Byte.class, IntegerCodec.instance);
        put(Short.class, IntegerCodec.instance);
        put(Integer.class, IntegerCodec.instance);
        put(Long.class, LongCodec.instance);
        put(Float.class, FloatCodec.instance);
        put(Double.class, DoubleSerializer.instance);
        put(BigDecimal.class, BigDecimalCodec.instance);
        put(BigInteger.class, BigIntegerCodec.instance);
        put(String.class, StringCodec.instance);
        put(byte[].class, PrimitiveArraySerializer.instance);
        put(short[].class, PrimitiveArraySerializer.instance);
        put(int[].class, PrimitiveArraySerializer.instance);
        put(long[].class, PrimitiveArraySerializer.instance);
        put(float[].class, PrimitiveArraySerializer.instance);
        put(double[].class, PrimitiveArraySerializer.instance);
        put(boolean[].class, PrimitiveArraySerializer.instance);
        put(char[].class, PrimitiveArraySerializer.instance);
        put(Object[].class, ObjectArrayCodec.instance);
        put(Class.class, MiscCodec.instance);

        put(SimpleDateFormat.class, MiscCodec.instance);
        put(Currency.class, new MiscCodec());
        put(TimeZone.class, MiscCodec.instance);
        put(InetAddress.class, MiscCodec.instance);
        put(Inet4Address.class, MiscCodec.instance);
        put(Inet6Address.class, MiscCodec.instance);
        put(InetSocketAddress.class, MiscCodec.instance);
        put(File.class, MiscCodec.instance);
        put(Appendable.class, AppendableSerializer.instance);
        put(StringBuffer.class, AppendableSerializer.instance);
        put(StringBuilder.class, AppendableSerializer.instance);
        put(Charset.class, ToStringSerializer.instance);
        put(Pattern.class, ToStringSerializer.instance);
        put(Locale.class, ToStringSerializer.instance);
        put(URI.class, ToStringSerializer.instance);
        put(URL.class, ToStringSerializer.instance);
        put(UUID.class, ToStringSerializer.instance);

        // atomic
        put(AtomicBoolean.class, AtomicCodec.instance);
        put(AtomicInteger.class, AtomicCodec.instance);
        put(AtomicLong.class, AtomicCodec.instance);
        put(AtomicReference.class, ReferenceCodec.instance);
        put(AtomicIntegerArray.class, AtomicCodec.instance);
        put(AtomicLongArray.class, AtomicCodec.instance);

        put(WeakReference.class, ReferenceCodec.instance);
        put(SoftReference.class, ReferenceCodec.instance);

        put(linkedList.class, CollectionCodec.instance);
    }

为IdentityHashMap这个类放入了一系列java中基本的类以及对应的实例化对象,所以这个map应该是一个管理类序列化器的map,我们通过java中基本类型的类名可以获取其实列对象,也可以通过类的对象去获得它的类。
我们观察到put进serializers的参数中有类似xxCodec这样的类:

可以看到它的instance参数就是返回一个该对象的实例,

这个类不仅实现了ObjectSerializer还实现了ObjectDeserializer,其具有序列化和反序列化的功能,所以也被称为编码器;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571764.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号