fastjson深度源码解析- 序列化(五) - json内部注册序列化解析

本文深入探讨fastjson的序列化过程,分析了包括BooleanCodec、CharacterCodec、IntegerCodec等在内的多种类型序列化实现。通过研究,揭示了fastjson如何优化输出,如处理null值、特殊标识整数范围、简化JDK内部对象输出等策略。
摘要由CSDN通过智能技术生成

序列化回调接口实现分析

内部注册的序列化

fastjson针对常用的类型已经注册了序列化实现方案:

注册的类型 序列化实例 是否支持序列化 是否支持反序列化
Boolean BooleanCodec
Character CharacterCodec
Byte IntegerCodec
Short IntegerCodec
Integer IntegerCodec
Long LongCodec
Float FloatCodec
Double DoubleSerializer -
BigDecimal BigDecimalCodec
BigInteger BigIntegerCodec
String StringCodec
byte[] PrimitiveArraySerializer -
short[] PrimitiveArraySerializer -
int[] PrimitiveArraySerializer -
long[] PrimitiveArraySerializer -
float[] PrimitiveArraySerializer -
double[] PrimitiveArraySerializer -
boolean[] PrimitiveArraySerializer -
char[] PrimitiveArraySerializer -
Object[] ObjectArrayCodec
Class MiscCodec
SimpleDateFormat MiscCodec
Currency MiscCodec
TimeZone MiscCodec
InetAddress MiscCodec
Inet4Address MiscCodec
Inet6Address MiscCodec
InetSocketAddress MiscCodec
File MiscCodec
Appendable AppendableSerializer -
StringBuffer AppendableSerializer -
StringBuilder AppendableSerializer -
Charset ToStringSerializer -
Pattern ToStringSerializer -
Locale ToStringSerializer -
URI ToStringSerializer -
URL ToStringSerializer -
UUID ToStringSerializer -
AtomicBoolean AtomicCodec
AtomicInteger AtomicCodec
AtomicLong AtomicCodec
AtomicReference ReferenceCodec
AtomicIntegerArray AtomicCodec
AtomicLongArray AtomicCodec
WeakReference ReferenceCodec
SoftReference ReferenceCodec
LinkedList CollectionCodec

BooleanCodec序列化

其实理解了前面分析SerializeWriter, 接下来的内容比较容易理解, BooleanCodec 序列化实现 :

    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;

        /** 当前object是boolean值, 如果为null,
         *  并且序列化开启WriteNullBooleanAsFalse特性, 输出false
         */
        Boolean value = (Boolean) object;
        if (value == null) {
            out.writeNull(SerializerFeature.WriteNullBooleanAsFalse);
            return;
        }

        if (value.booleanValue()) {
            out.write("true");
        } else {
            out.write("false");
        }
    }

BooleanCodec序列化实现主要判断是否开启如果为null值是否输出false,否则输出boolean字面量值。

CharacterCodec序列化

    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;

        Character value = (Character) object;
        if (value == null) {
            /** 字符串为空,输出空字符串 */
            out.writeString("");
            return;
        }

        char c = value.charValue();
        if (c == 0) {
            /** 空白字符,输出unicode空格字符 */
            out.writeString("\u0000");
        } else {
            /** 输出字符串值 */
            out.writeString(value.toString());
        }
    }

IntegerCodec序列化

    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.out;

        Number value = (Number) object;

        /** 当前object是整形值, 如果为null,
         *  并且序列化开启WriteNullNumberAsZero特性, 输出0
         */
        if (value == null) {
            out.writeNull(SerializerFeature.WriteNullNumberAsZero);
            return;
        }

        /** 判断整形或者长整型,直接输出 */
        if
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值