点击上方蓝色“Java关发”,关注并选择“设为星标”
持之以恒,贵在坚持,每天进步一点点!

前文提示
设计序列层主要思考一下几个问题:
为什么要设计这个层?
如何设计序列化层?
上层如何创建序列化层?
带着这几个问题,我们在dubbo源码中寻找答案。
一. 为什么要设计序列化层
一个是便于测试,一个是方便解耦。如果让序列化层代码与传输层代码耦合,在切换不同的序列化框架时及其麻烦,每次调整都需要改动代码。
二. 如何设计序列化层?
可以想象序列化层是一个黑盒,上层(传输层)输入对象到黑盒,输出字节。输入字节,输出对象。

非常自然的,我们可以设计这么个接口:
public interface Serilizer {byte[] serilize(Object obj);Object deserilize(byte[] bytes)}
这个接口定义的视乎非常的完美,输入输出非常符合黑盒逻辑。但再思考下实际调用会不会出现以下情况:
序列化输入 byte[] 数组是要读取数组中每个字节吗?或者仅仅读取前10个字节数据?
Java的基本数据类型不是Object类型,无法作为输入。
在传输层传输时,可能会先传递版本号(常为int类型),在传送实际数据(比如对象),在进行序列化。输出时可能会先输出版本号,在输出数据。
对于第一个问题,JDK库中有一个对象可以很好的满足我们的需求。没错,就是InputStream/OutputStream。
对于第二个问题,我们需要额外添加基本类型的序列化、反序列化方法。
对于第三个问题,我们可能需要一个东西来临时存储字节数组。JDK库也有一个好东西,那就是ObjectInputStream。
按照上面设计下来,其实就是Dubbo 的序列化层代码设计了。
三. 上层如何创建序列化层?
一直在说序列化层会有什么JDK实现、GSON实现、fastjson实现。那么这个实现的选择权在谁手中呢?没错,在传输层手中,所以传输层也需要给一个参数来表明调用哪个实现。
四. Dubbo代码图解
下面看下Dubbo代码如何编写。






文章末尾
当有了序列化后,下一个就要实现传输层了,传输层又该如何设计呢?
欲知后事如何,请见下文分享。




