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<Type, ObjectSerializer> serializers;
private final IdentityHashMap<Type, IdentityHashMap<Type, ObjectSerializer>> 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,其具有序列化和反序列化的功能,所以也被称为编码器;