序列化回调接口实现分析
内部注册的序列化
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