2021SC@SDUSC
本篇简介
在之前的篇章中,我们分析了JSON字节流输出方法writeJSONString(os,obj),除了这种JSON流输出外,还有一种JSON字符流的输出方法writeJSONString(writer,obj),本篇内容就按照之前的内容简单地讲解一下该方法的使用还有分析一下该方法的源码.
使用方法
将写入器作为参数传入,将会使用该写入器进行JSON字符串输出
结果:
源码分析
仍然先转到JSON类的代码:
这里相比于字节流的输出少了很多代码,主要是:
- filter配置
- 序列化器的日期格式
- 不会再调用SerializeWriter的write方法
但是相同的地方是都会初始化SerializeWriter和JSONSerializer,并且,将writer交给了SerializeWriter来管理了.这里我们主要看的就是当SerializeWriter初始化时传入了已有的写入器会怎么样.
同样的,JSON序列化器会为我们的object制造并选择合适的序列化器,然后回调我们的SerializeWriter的写入方法.
我们直接去看SerializeWriter方法中的write方法:
可以看到,和字节流不同的是,这里利用writer输出将不会直接去扩充缓冲区的容量了,而是将其作为真正的缓冲区,也就是说在字符流的输出中,SerializeWriter充当了BufferWriter相同的角色,辅助我们的Writer进行快速的输出.
这里的getChar方法是字符串的复制
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
参数
srcBegin
- 要复制的字符串中第一个字符的索引。srcEnd
- 要复制的字符串中最后一个字符后面的索引。dst
- 目标数组。dstBegin
- 目标数组中的起始偏移量。
总结
经过分析,可以看出字符流和字节流输出虽然在选择对象序列化器上完全相同,但是在底层输出逻辑上却截然不同,在字节流中序列化写入器扮演的其实就是一个写入器的功能,而在字符流中却又作为了缓冲写入器来辅助传入的写入器工作,可以说是一个兼顾了泛用与速度的设计了.